如何使用多线程/多处理并行高效地运行python脚本



我有一个python脚本child.py,它将由其他脚本main.py调用对于一次执行迭代,child.py需要近400ms

现在我想同时(并行)执行child.py的多个实例。我使用多处理模块通过将调用放入for循环来创建多个进程。

当我运行一次迭代时,花费了400毫秒。但当我增加for循环中的迭代次数时,执行时间也以400ms的倍数增加。

所以看起来执行是以同步的方式进行的,而不是并行执行。

我通过在日志文件中放置时间戳来验证执行时间。

有没有办法实现近400ms的执行时间,即使是脚本的大量并行执行?


这是我的脚本:

 for device in device_list:
            q= Queue.Queue()
            p =Process(target=get_current_value,
                       args=(q,),
                       kwargs=
                            {
                                    'device': device,
                                    'service_list': service_list,
                                    'data_source_list': data_source_list}
                            )
            p.start()
            p.join()
            logger.debug('data_source_list :'+ pformat(g.get()))

get_current_value是脚本child.py中的函数,它被称为

在for循环的每一次迭代中都调用p.join(),这意味着您要启动一个进程,等待它完成,然后再转到下一个进程。所以你并没有真正并行地做任何事情。删除对p.join()的调用,您应该会得到实际的并发执行。

 for device in device_list:
     q = Queue.Queue()
     p = Process(target=get_current_value,
                 args=(q,),
                 kwargs=
                 {
                     'device': device,
                     'service_list': service_list,
                      'data_source_list': data_source_list}
                 )
     p.start()
     #p.join()

最新更新