1.进程池和线程池差不多

  1. import time
  2. from concurrent.futures import ProcessPoolExecutor
  3. def task(num):
  4. print("执行", num)
  5. time.sleep(2)
  6. if __name__ == '__main__':
  7. pool = ProcessPoolExecutor(4)
  8. for i in range(10):
  9. pool.submit(task, i)
  10. # 等待进程池中的任务都执行完毕后,再继续往后执行。
  11. pool.shutdown(True)
  12. print(1)

2.进程池的回调函数使用主进程实现

  1. import time
  2. from concurrent.futures import ProcessPoolExecutor
  3. import multiprocessing
  4. def task(num):
  5. print("执行", num)
  6. time.sleep(2)
  7. return num
  8. def done(res):
  9. print(multiprocessing.current_process())
  10. time.sleep(1)
  11. print(res.result())
  12. time.sleep(1)
  13. if __name__ == '__main__':
  14. pool = ProcessPoolExecutor(4)
  15. for i in range(50):
  16. fur = pool.submit(task, i)
  17. fur.add_done_callback(done) # done的调用由主进程处理(与线程池不同)
  18. print(multiprocessing.current_process())
  19. pool.shutdown(True)

3.如果要对进程池使用锁,则需要manage的锁才可以完成

  1. import time
  2. import multiprocessing
  3. from concurrent.futures.process import ProcessPoolExecutor
  4. def task(lock):
  5. print("开始")
  6. # lock.acquire()
  7. # lock.relase()
  8. with lock:
  9. # 假设文件中保存的内容就是一个值:10
  10. with open('f1.txt', mode='r', encoding='utf-8') as f:
  11. current_num = int(f.read())
  12. print("排队抢票了")
  13. time.sleep(1)
  14. current_num -= 1
  15. with open('f1.txt', mode='w', encoding='utf-8') as f:
  16. f.write(str(current_num))
  17. if __name__ == '__main__':
  18. pool = ProcessPoolExecutor()
  19. # lock_object = multiprocessing.RLock() # 不能使用
  20. manager = multiprocessing.Manager()
  21. lock_object = manager.RLock() # Lock
  22. for i in range(10):
  23. pool.submit(task, lock_object)