我尝试构建一个多处理脚本,从MySQL表中检索属性的dicts,然后在 parallel 中运行我的主脚本实例,使用从MySQL表中检索到的每个dict作为主脚本的每个实例的参数。主脚本有一个名为queen_bee()的方法,该方法负责确保所有其他方法都具有正确的信息并以正确的顺序执行。
我尝试遍历dicts列表,以便使用多处理库创建/运行主脚本的并行进程。但它们最终连续运行,而不是同时运行:
from my_main_script import my_main_class as main
import multiprocessing as mp
def create_list_of_attribute_dicts():
...
return list_of_dicts
for each_dict in list_of_dicts:
instance = main(each_dict)
p = mp.Process(target=instance.queen_bee(),args=(each_dict,))
p.start()
...
我也尝试过使用多处理库的Pool.map()方法。但我无法弄清楚如何使用Pool.map()为每个dict实例化主脚本一次:
...
pool = mp.Pool()
jobs = pool.map(main.queen_bee(),list_of_dicts)
Pool.map方法似乎是让这些实例并行运行的最干净,最pythonic的方式,但在这种情况下,我已经挂断了正确的方法。我知道上面的工作'变量将失败,因为' main'尚未实例化。但是,我无法弄清楚如何将每个dict作为参数传递给主类的单独实例,然后使用map方法运行这些实例。我愿意尝试不同的方法。在此先感谢您的帮助。
答案 0 :(得分:0)
我想我舔了它。答案似乎是使用Pool的map函数来调用 inside 相同的多处理脚本的worker函数。然后,worker函数实例化调用其自己的worker函数的主脚本(在这种情况下,' queen_bee')。
使用上面的代码示例:
from my_main_script import my_main_class as main
import multiprocessing as mp
def create_list_of_active_job_attribute_dicts():
...
return active_jobs
def call_the_queen(individual_active_job):
instance = main(individual_active_job)
instance.queen_bee()
if __name__ == '__main__':
pool = mp.Pool(processes = 4)
pool.map(call_the_queen,active_jobs)
pool.close()
pool.join()
我不知道为什么这种方法有效,而另一方则没有。如果有人想要权衡并解释,我将不胜感激。谢谢@coder的帮助!