例如。我有一个控制器脚本。我有一个工人脚本。我有50个python对象,这些对象必须传递给worker脚本。我希望它们并行运行。
工作脚本有自己的一些数据库获取的并行化。这是我通过以下方式实现的:
p = Pool(processes=NUM_PROCS)
results = p.starmap(db_fetch, db_fetch_arguments)
p.close()
p.join()
最python的方式是,我可以将我的50个参数(python对象,而不是字符串参数)传递给我的工作进程,并使其并行运行,当工作进程试图生成更多的子进程时,不会出现任何问题。
提前谢谢。
编辑1:
from multiprocessing import Pool
import os
def worker(num:int):
num_list = list(range(num))
# print('worker start')
with Pool() as p:
p.map(printer, num_list)
def printer(num:int):
# print('printer')
print(f"Printing num {num} - child: {os.getpid()} - parent: {os.getppid()}")
if __name__ == '__main__':
with Pool(4) as controller_pool:
controller_pool.map(worker, [1,2,3])
print('here')
这里我得到了错误:断言错误:守护进程不允许有子
使用concurrent.futures中的ProcessPoolExecutor作为我的控制器外池。在内部,我使用了正常的多处理。池
谢谢。
from multiprocessing import Pool
from concurrent.futures import ProcessPoolExecutor
import os
def worker(num:int):
num_list = list(range(num))
# print('worker start')
with Pool() as p:
p.map(printer, num_list)
def printer(num:int):
# print('printer')
print(f"Printing num {num} - child: {os.getpid()} - parent: {os.getppid()}")
if __name__ == '__main__':
with ProcessPoolExecutor(4) as controller_pool:
controller_pool.map(worker, [1,2,3])
print('here')