2012-11-15 26 views
2

我的問題是完成子進程,我使用多進程庫,並在一臺機器與返回或退出線,進程死在加入之前,但在另一臺機器沒有。這個過程一直在增長,他們在完成工作後都沒有完成。在這兩臺機器上,python的版本是2.7.3rc2。python多進程不能正常完成

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) 

謝謝。

+1

最後我找到了原因,但我不明白爲什麼。 當我在子進程中使用隊列對象時,有時候這個隊列會產生另一個子進程,然後這個進程永遠不會死。 –

回答

0

服務器具有12個CPU(英特爾(R)核心(TM)i7-3930K CPU @ 3.20GHz,1200 MHz)的並安裝了GNU/Linux Debian Weezy。

我的時間醜陋的解決方案是:

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

您好我想重現上這兩款機器同樣的問題:

的Python 2.6.7(r267:88850,2012年2月2日,二十三時50分20秒)的Cygwin在Vista上

的Python 2.7。 3(默認,2012年8月1日,05:16:07)Ubuntu 12.04

兩者在p.join()後都正確完成。

解釋1: 但是,如果我將PROC_S_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

服務器中的問題是子進程在返回或退出語句後沒有完成。 信號量正常工作。 服務器有12個CPU,操作系統是GNU/Linux Debian Weezy。 –

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