[英]Python multiprocessing wait for sleep
我试图找出多处理在Python中的工作方式。 以下示例是我所做的:
import requests
from multiprocessing import Process
import time
def f(name):
print 'hello', name
time.sleep(15)
print 'ended', name
if __name__ == '__main__':
urls = [
'http://python-requests.org',
'http://httpbin.org',
'http://python-guide.org'
]
for url in urls:
p = Process(target=f, args=(url,))
p.start()
p.join()
print("finished")
我试图在f中模拟的是对具有15秒超时的URL的请求。 我希望发生的是,所有请求几乎都在同一时间开始,并且在同一时间完成。 但是实际上发生的是它们都彼此开始,并等到前一个完成为止。 因此结果是:
那么实际发生了什么? 为什么要使用上面的代码而不是仅仅这样做:
for url in urls:
f(url)
问题是你的循环:
for url in urls:
p = Process(target=f, args=(url,))
p.start()
p.join()
您正在开始该过程,然后等待它完成,然后开始下一个过程...
相反,创建您的进程列表,启动它们,然后等待它们:
pl = [Process(target=f, args=(url,)) for url in urls]
for p in pl:
p.start()
for p in pl:
p.join()
请注意,在那种情况下,使用Process
可能会过大,因为线程可以很好地完成工作(不涉及大量的python计算,仅涉及系统调用和联网)
要切换到线程,只需使用multiprocessing.dummy
这样您的程序结构将保持不变。
import multiprocessing.dummy as multiprocessing
您只生成一个进程。 因此,该进程(唯一的工作程序)获取第一个输入,运行f,在15秒内超时,退出f; 然后接受第二个输入。 cf 文件
您可以尝试将函数f与输入映射。 在下面的示例中,您生成2个进程(2个工作程序)。
import multiprocessing as mp
if __name__ == '__main__':
with mp.Pool(processes = 2) as p:
p.map(f, urls)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.