繁体   English   中英

Python多处理等待睡眠

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

你好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)

问题是你的循环:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM