1.进程池和线程池差不多
import timefrom concurrent.futures import ProcessPoolExecutordef task(num): print("执行", num) time.sleep(2)if __name__ == '__main__': pool = ProcessPoolExecutor(4) for i in range(10): pool.submit(task, i) # 等待进程池中的任务都执行完毕后,再继续往后执行。 pool.shutdown(True) print(1)
2.进程池的回调函数使用主进程实现
import timefrom concurrent.futures import ProcessPoolExecutorimport multiprocessingdef task(num): print("执行", num) time.sleep(2) return numdef done(res): print(multiprocessing.current_process()) time.sleep(1) print(res.result()) time.sleep(1)if __name__ == '__main__': pool = ProcessPoolExecutor(4) for i in range(50): fur = pool.submit(task, i) fur.add_done_callback(done) # done的调用由主进程处理(与线程池不同) print(multiprocessing.current_process()) pool.shutdown(True)
3.如果要对进程池使用锁,则需要manage的锁才可以完成
import timeimport multiprocessingfrom concurrent.futures.process import ProcessPoolExecutordef task(lock): print("开始") # lock.acquire() # lock.relase() with lock: # 假设文件中保存的内容就是一个值:10 with open('f1.txt', mode='r', encoding='utf-8') as f: current_num = int(f.read()) print("排队抢票了") time.sleep(1) current_num -= 1 with open('f1.txt', mode='w', encoding='utf-8') as f: f.write(str(current_num))if __name__ == '__main__': pool = ProcessPoolExecutor() # lock_object = multiprocessing.RLock() # 不能使用 manager = multiprocessing.Manager() lock_object = manager.RLock() # Lock for i in range(10): pool.submit(task, lock_object)