Python多处理等待睡眠

时间:2018-07-20 12:32:12

标签: python multiprocessing

我试图找出multiprocessing在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的请求。我希望发生的是,所有请求几乎都在同一时间开始,并且在同一时间完成。但是实际上发生的是它们都彼此开始,并等到前一个完成为止。结果是:

  

你好http://python-requests.org

     

http://python-requests.org结尾

     

你好http://httpbin.org

     

http://httpbin.org结尾

     

你好http://python-guide.org

     

http://python-guide.org结尾

那么实际发生了什么?为什么一个人使用上面的代码而不是仅仅做:

    for url in urls:
        f(url)

2 个答案:

答案 0 :(得分:3)

问题出在你的循环中

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

答案 1 :(得分:1)

您仅生成一个进程。因此,该进程(唯一的工作程序)获取第一个输入,运行f,在15秒内超时,退出f;然后接受第二个输入。 c.f. doc

您可以尝试将函数f与输入映射。在下面的示例中,您生成了2个进程(2个工作程序)。

import multiprocessing as mp

if __name__ == '__main__':
    with mp.Pool(processes = 2) as p:
        p.map(f, urls)