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

时间:2014-08-29 23:15:43

标签: python multithreading multiprocessing

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

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

当我运行一次迭代时,耗时400ms。但是当我增加for循环中的迭代次数时,执行时间也会增加近400ms的倍数。

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

我通过在记录文件中添加时间戳来验证执行时间。

有没有办法实现近400毫秒的执行时间,即使对于脚本的大量并行执行也是如此?


这是我的剧本:

 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中的函数,被称为

1 个答案:

答案 0 :(得分:1)

您在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()