当前位置: 首页 > 面试题库 >

Process.join()和队列不适用于大量

卢光誉
2023-03-14
问题内容

我试图分裂循环即

N = 1000000
for i in xrange(N):
    #do something

使用multiprocessing.Process,它对于较小的N值效果很好。当我使用较大的N值时,就会出现问题。在p.join()之前或期间发生了一些奇怪的事情,并且程序没有响应。如果我将print
i放在函数f的定义中,而不是q.put(i),则一切正常。

我将不胜感激任何帮助。这是代码。

from multiprocessing import Process, Queue

def f(q,nMin, nMax): # function for multiprocessing
    for i in xrange(nMin,nMax):
        q.put(i)

if __name__ == '__main__':

    nEntries = 1000000

    nCpu = 10
    nEventsPerCpu = nEntries/nCpu
    processes = []

    q = Queue()

    for i in xrange(nCpu):
        processes.append( Process( target=f, args=(q,i*nEventsPerCpu,(i+1)*nEventsPerCpu) ) )

    for p in processes:
        p.start()

    for p in processes:
        p.join()

    print q.qsize()

问题答案:

您正在尝试无限制地增加队列,并且您正在加入一个等待队列中有空间的子进程,因此您的主进程被拖延以等待该进程完成,而永远不会。

如果在连接之前将数据从队列中拉出,它将可以正常工作。

您可以使用的一种技术是这样的:

while 1:
    running = any(p.is_alive() for p in processes)
    while not queue.empty():
       process_queue_data()
    if not running:
        break

根据文档,p.is_alive()应该执行隐式连接,但它似乎还暗示最佳实践可能是在此之后在所有线程上显式执行连接。

编辑:尽管这很清楚,但可能不是全部。如何使其性能更好取决于任务和计算机的具体情况(通常,一次不应该一次创建那么多进程,除非某些进程将在I / O上被阻塞)。

除了将进程数量减少到CPU数量之外,一些简单的修复方法也可以使其更快一些(再次取决于具体情况),如下所示:

liveprocs = list(processes)
while liveprocs:
    try:
        while 1:
            process_queue_data(q.get(False))
    except Queue.Empty:
        pass

    time.sleep(0.5)    # Give tasks a chance to put more data in
    if not q.empty():
        continue
    liveprocs = [p for p in liveprocs if p.is_alive()]


 类似资料:
  • 下载获取文件Expert_support_promo.png 利用适用于团队的 Creative Cloud,您可以在最新的创意桌面应用程序发布后第一时间内使用它们,并可以使用打造最佳作品所需的协作工具和服务。 作为管理员,可通过适用于团队的 Creative Cloud 专用的 Admin Console 快速部署席位,根据需要删除和重新分配席位,随时通过电话获取高级技术支持,并基于初次购买的周

  • 我正在使用JSON API插件与我的wordpress页面,get_recent_posts json的数组大小约为250个帖子。例如,当我调用 http://www.example.org/api/get_recent_posts/ 在浏览器中查看这些帖子时,我得到一个空白页面,控制台中没有错误。但是,如果我限制例如 http://www.example.org/api/get_recent_p

  • im使用pyqt5创建gui并使用matplotlib 但是当我尝试创建pyInster可执行文件时,它不起作用 我尝试了以下几种解决方案: 1-无法使用PyInstaller创建工作的PyQt5 Python可执行文件/ 2-在PyInstaller,为什么不会NumPy。随机的。作为模块的公共负载? 3-PyInstaller生成的可执行文件中出现Python SSL导入错误 我尝试使用cx\

  • 问题内容: 以下代码可在Google Chrome beta和IE 7中运行。但是,Firefox似乎对此有问题。我怀疑这是我的CSS文件如何包含的问题,因为我知道Firefox对跨域导入不太友好。 但这仅仅是静态HTML,而没有跨域问题。 在我的landing-page.html上,我像这样进行CSS导入: 在main.css中,我还有另一个导入,例如: 在type.css中,我有以下声明: 我

  • AWS SQS FIFO队列的批处理设置为1,延迟为1秒。收到的每个项目都与一个MessageGroup相关联。 队列同时接收10个不同消息组的30条消息,每个消息组包含3条消息。。。 一秒钟的延迟是否适用于队列级别,即30条消息需要30秒的传递时间? 还是队列会启动10个消费者,每个消息组一个,在3秒内清空队列?

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt