從技術上講,正確的做法是將初始化函數的結果作爲參數傳遞給worker所執行的每個函數。
在這種情況下,確實具有全局變量是很好也是安全的,因爲通過構建它們可以使私人對象生活在不同過程的不同領域。
我的一般建議是用一種健全的reentrant編程風格構建函數,並在利用multiprocessing
功能時允許全局變量。
保持你的榜樣,下面send
功能需要一些背景(在這種情況下,插座):
def send(socket, data):
pass # ... your code here
return dust
初始化代碼和由工人執行的基本代碼將依賴於全局變量方便。
socket = None
def init(address, port):
global socket
socket = magic(address, port)
def job(data):
global socket
assert socket is not None
return send(socket, data)
pool = multithreading.Pool(N, init, [address, port])
pool.map(job, ['foo', 'bar', 'baz'])
通過這種方式它變得簡單而自然地測試它沒有多處理對其進行編碼。您可以將您的全局狀態視爲完全安全的上下文膠囊。
爲了方便起見,請記住multiprocessing
不擅長髮送複雜數據(例如回調)。最好的方法是發送簡單的數據(字符串,列表,字典,collections.namedtuple
...),並重新構建工作端的複雜數據結構(使用初始化函數)。
我有點不清楚爲什麼你的初始化函數需要對工作者的引用,也許你可以提供一個稍微更具體但最簡單的例子,你正在嘗試做什麼。 – mgilson 2012-03-30 14:11:53
您知道有沒有辦法告訴*哪個* worker將被分配給特定的函數調用?那麼爲什麼不簡單在函數參數中包含該狀態呢? – 2012-03-30 14:16:27