python多进程没有正确完成

时间:2012-11-15 10:31:59

标签: python multiprocessing

我的问题是完成子进程,我使用多进程库,并在一台带有返回或退出线的机器中,进程在连接之前死亡,但在另一台机器中没有。这些过程总是在不断发展,在完成工作后都没有完成。在这两台机器中,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)

谢谢。

3 个答案:

答案 0 :(得分:1)

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

Python 2.6.7(r267:88850,2012年2月2日,23:50:20)Vista上的Cygwin

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

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

说明1: 但是,如果我将PROCS_LIMIT降低到较低的数字,则len(单词)最后一个进程不会完成。

解释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()

答案 1 :(得分:1)

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

在这里,我用信号量的发布编写了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()

答案 2 :(得分:0)

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

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

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