2011-10-31 46 views
0

可能重複:
Multiprocessing launching too many instances of Python VM蟒蛇多進程調用者(以及被叫)在Windows XP中多次調用

我試圖使用Python多進程並行網頁抓取,但我發現調用多處理的應用程序被多次實例化,而不僅僅是我想要調用的函數(這對我來說是一個問題,因爲調用者對實例化的庫有一些依賴關係 - 失去了大部分性能提升從pa rallelism)。

我在做什麼錯誤或如何避免?

my_app.py:

from url_fetcher import url_fetch, parallel_fetch 
import my_slow_stuff 

my_slow_stuff.py:

if __name__ == '__main__': 
    import datetime 
    urls = ['http://www.microsoft.com'] * 20 
    results = parallel_fetch(urls, fn=url_fetch) 
    print([x[:20] for x in results]) 

class MySlowStuff(object): 
    import time 
    print('doing slow stuff') 
    time.sleep(0) 
    print('done slow stuff') 

url_fetcher.py:

import multiprocessing 
import urllib 

def url_fetch(url): 
    #return urllib.urlopen(url).read() 
    return url 

def parallel_fetch(urls, fn): 
    PROCESSES = 10 
    CHUNK_SIZE = 1 
    pool = multiprocessing.Pool(PROCESSES) 
    results = pool.imap(fn, urls, CHUNK_SIZE) 
    return results 

if __name__ == '__main__': 
    import datetime 
    urls = ['http://www.microsoft.com'] * 20 
    results = parallel_fetch(urls, fn=url_fetch) 
    print([x[:20] for x in results]) 

部分輸出:

$ python my_app.py 
doing slow stuff 
done slow stuff 
doing slow stuff 
done slow stuff 
doing slow stuff 
done slow stuff 
doing slow stuff 
done slow stuff 
doing slow stuff 
done slow stuff 

...

+0

更多信息你在Windows上觀察到這一點? –

+0

是的,我是。事實上,在我的Linux服務器上,它並沒有表現出這種行爲。 – RuiDC

回答

1

用於Windows的Python多模塊的行爲略有不同,因爲Python沒有實現這個平臺上os.fork()。特別是:

主要模塊的安全進口

確保主模塊可以通過一個新的Python解釋器可以安全地進口,而不會導致意想不到的副作用(例如一開始一個新的進程)。

在這裏,全球class MySlowStuff得到總是在Windows上新開工的子進程進行評估。要修復class MySlowStuff應僅在__name__ == '__main__'時定義。

查看16.6.3.2. Windows瞭解更多詳情。

+0

謝謝,只要你提到windows,我知道我會(誤)讀那部分,認爲它與被調用者有關。 – RuiDC

0

windows上的多處理模塊與Unix/Linux中的多處理模塊不一樣。在Linux上,它使用fork命令,並將所有上下文複製/複製到分支時的新分支。

系統調用fork不exsit在Windows和多模塊創建一個新的Python程序,並再次加載所有的模塊,這就是爲什麼使用mutiprocessing當上了python lib documetnacion迫使你用戶if __name__ == '__main__'招的原因在窗戶上。

這種情況的解決方案是使用線程代替。這種情況是一個IO綁定的過程,並且你可以避免GIL問題的優點,即多重處理不會影響你。在http://docs.python.org/library/multiprocessing.html#windows

+0

謝謝,但雖然沒有在問題中說明,但我還有其他任務需要執行,例如zlib解壓縮和xml解析,這使我使用多進程而不是線程。 – RuiDC