2

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

谢谢你。

4

3 回答 3

1

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

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

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()
于 2012-11-15T11:35:45.010 回答
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()
于 2012-11-21T12:45:15.723 回答
0

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

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

os.kill(os.getpid(), 9)
于 2012-11-21T12:07:11.773 回答