【问题标题】:python multiprocess don't finish properlypython多进程没有正确完成
【发布时间】:2012-11-15 10:31:58
【问题描述】:

我的问题是完成子进程,我使用多进程库,并且在一台带有返回或退出线的机器上,进程在加入之前死亡,但在另一台机器上没有。这些过程总是在增长,并且在完成工作后它们都不会完成。两台机器的python版本都是2.7.3rc2。

semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT)

# Starting searches
procs = []
for word in words:
    semaphore_processes_limit.acquire()
    p = Process(target=searching, args=(word,))
    procs.append(p)
    p.start()

# Wait for all worker processes to finish
for p in procs:
    p.join()

# Process
def searching(word):
return # or exit(0)

谢谢。

【问题讨论】:

  • 终于找到了原因,但我不明白为什么。当我在子进程中使用 Queue 对象时,有时这个 Queue 会产生另一个子进程,然后这个进程永远不会死。

标签: python multiprocessing


【解决方案1】:

您好,我尝试在这两台机器上重现同样的问题:

Python 2.6.7 (r267:88850, Feb 2 2012, 23:50:20) Cygwin on Vista

Python 2.7.3(默认,2012 年 8 月 1 日,05:16:07)Ubuntu 12.04

它们都在 p.join() 之后正确完成。

解释1: 但是,如果我将 PROCS_LIMIT 降低到低于 len(words) 的数字,则最后一个过程不会完成。

解释2: 信号量可以在不同的主机操作系统上以不同的方式处理。从而产生不同的结果。 请参阅本页顶部的警告:http://docs.python.org/2/library/multiprocessing.html

之前由于缺乏线程支持,我在 Cygwin 上的 python 中的子进程模块遇到了问题。

您能描述一下您正在运行的机器类型和操作系统吗?

这是我对您的代码进行的修改以使其运行:

from multiprocessing import *
from threading import *

# Process
def searching(word):
    print(word)
    return # or exit(0)

PROCS_LIMIT = 5
semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT)

# Starting searches
words = ["foo", "bar", "baz", "buz", "biz"]
procs = []
for word in words:
    semaphore_processes_limit.acquire()
    p = Process(target=searching, args=(word,))
    procs.append(p)
    p.start()

# Wait for all worker processes to finish
for p in procs:
    p.join()

【讨论】:

  • 服务器的问题是子进程在return或exit语句后没有完成。信号量正常工作。服务器有 12 个 CPU,操作系统是 GNU/Linux Debian Weezy。
【解决方案2】:

最后是服务器错误,但我不知道是什么。

这里我用信号量的版本编写了 kugg 的示例,以便可以使用低 PROCS_LIMIT:

from multiprocessing import *

PROCS_LIMIT = 2
semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT)

# Process
def process(word):
    print(word)
    semaphore_processes_limit.release()
    return

# Starting searches
words = ["foo", "bar", "baz", "buz", "biz"]
procs = []
for word in words:
    semaphore_processes_limit.acquire()
    p = Process(target=process, args=(word,))
    procs.append(p)
    p.start()

# Wait for all worker processes to finish
for p in procs:
    p.join()

【讨论】:

    【解决方案3】:

    服务器有 12 个 CPU(Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz,1200 MHz)并安装了 GNU/Linux Debian Weezy。

    我暂时丑陋的解决方案是:

    os.kill(os.getpid(), 9)
    

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2021-08-24
      • 1970-01-01
      • 2015-05-27
      相关资源
      最近更新 更多