Python,多处理库问题
我有一个程序,在这个程序中,我想为几个参数并行运行其中一个函数 该程序采用以下格式:Python,多处理库问题,python,multithreading,function,multiprocessing,main,Python,Multithreading,Function,Multiprocessing,Main,我有一个程序,在这个程序中,我想为几个参数并行运行其中一个函数 该程序采用以下格式: import statements def function1(): do something def function2() do something def main(): function1() 我在网上找到了几个如何使用多处理库的示例,例如下面的通用模板 import multiprocessing def worker(num): print 'Wo
import statements
def function1():
do something
def function2()
do something
def main():
function1()
我在网上找到了几个如何使用多处理
库的示例,例如下面的通用模板
import multiprocessing
def worker(num):
print 'Worker:', num
return
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
据我所知,worker()
是一个并行执行的函数。但我不知道在哪里或如何使用该软件
(如果uuuu name_uuuu=='\uuuuu main_uuu':
)阻止代码
到目前为止,该块位于我的main()
中,当我运行该程序时,我不会多次执行辅助函数,而是多次执行我的main
那么(
如果
将你提供的两个示例混合在一起,它会是这样的:
import multiprocessing
def worker(num):
print 'Worker:', num
return
def main():
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
p.join()
if __name__ == '__main__':
main()
用function1
替换worker
,即您希望并行化的功能
关键部分是调用if uuu name uuu='uuu main uu':
块中的main
函数,但是在这个简单的示例中,您可以很容易地将代码直接放在if uuu name uu='uuu main:
下的下
如果你永远都不打算从这个文件中导入任何东西,你甚至不需要If\uuuuuu name\uuuuu=='\uuuuuuu main\uuuuu':
part;仅当您希望能够在不运行main()
中的代码的情况下将此脚本中的函数导入其他脚本/交互式会话时,才需要此选项。看
因此,最简单的用法是:
import multiprocessing
def worker(num):
print 'Worker:', num
return
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
p.join()
编辑:多处理池示例
import multiprocessing
def worker(num):
#print 'Worker:', num
return num
pool = multiprocessing.Pool(multiprocessing.cpu_count())
result = pool.imap(worker, range(5))
print list(result)
印刷品:
[0, 1, 2, 3, 4]
有关更多详细说明,请参见。将并行化逻辑(对多处理
的调用)放入主
函数中。然后,从中调用main
,如果需要显示正在运行的实际代码,则。由于您显示的代码中没有任何内容调用您的main()
函数,因此我们无法猜测调用它的原因。但是,如果您按照第二个发布的模板进行操作,您的代码将正常工作。当我运行第一个版本时,它正常工作,但它没有给我预期的输出,即worker:0、worker:1、worker:2。。。相反,每次我运行它时,顺序都会变化,有时是(1,2,0,4,3)或(0,3,2,1,4)也是您提供的第二个版本,但没有if name=='main':在我尝试它时永远运行顺序会变化,因为多处理
将对工作者
的每个调用拆分为跨多个核的单独进程,不考虑调用、完成和返回过程的顺序。结果按完成的顺序返回,而不是按调用的顺序返回。如果要保留顺序,请查看多处理.pool
和apply\u async
或imap
。对于第二个版本,如果它不在功能块中,则可能需要.join()
。看见