python多进程don';我不能很好地完成

python多进程don';我不能很好地完成,python,multiprocessing,Python,Multiprocessing,我的问题是完成子进程,我使用多进程库,在一台带有返回或退出行的机器上,进程在连接之前死亡,但在另一台机器上没有。这些过程总是在增长,而且在完成任务之后,它们都没有完成。在这两种机器中,python的版本都是2.7.3rc2 semaphore_processes_limit = BoundedSemaphore(value=PROCS_LIMIT) # Starting searches procs = [] for word in words: semaphore_processes

我的问题是完成子进程,我使用多进程库,在一台带有返回或退出行的机器上,进程在连接之前死亡,但在另一台机器上没有。这些过程总是在增长,而且在完成任务之后,它们都没有完成。在这两种机器中,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)

谢谢。

嗨,我试图在这两台机器上重现相同的问题:

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_限制降低到一个比len(words)低的数字,则最后一个过程不会完成

解释2: 信号量可以在不同的主机操作系统上进行不同的处理。从而产生不同的结果。 请参阅本页顶部的警告:

之前,由于缺乏线程支持,我在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()
该服务器有12个CPU(Intel(R)Core(TM)i7-3930K CPU@3.20GHz,1200 MHz),并安装了GNU/Linux Debian Weezy

我的解决方案是:

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

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

在这里,我编写了kugg的示例,其中包含信号量的释放,以便可以使用较低的PROCS_限制:

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

服务器中的问题是,在return或exit语句之后,子进程没有完成。信号灯工作正常。服务器有12个CPU,操作系统是GNU/Linux Debian Weezy。最后我找到了原因,但我不明白为什么。当我在子进程内使用队列对象时,有时这个队列会生成另一个子进程,然后这个进程就永远不会死。