2012-01-06 35 views
4

我是新來的多處理python3多處理例如墜毀我的電腦:(

我已經運行了兩個示例代碼「強烈推薦」,以響應其他計算器多問題,給出多的例子。這是(一個的例子當我運行此我的計算機速度變慢了緊急的,我可不敢再次運行!)

test2.py(從PyDev的運行)

import multiprocessing 

class MyFancyClass(object): 

    def __init__(self, name): 
     self.name = name 

    def do_something(self): 
     proc_name = multiprocessing.current_process().name 
     print(proc_name, self.name) 


def worker(q): 
    obj = q.get() 
    obj.do_something() 



queue = multiprocessing.Queue() 

p = multiprocessing.Process(target=worker, args=(queue,)) 
p.start() 

queue.put(MyFancyClass('Fancy Dan')) 

# Wait for the worker to finish 
queue.close() 
queue.join_thread() 
p.join() 

。它變得逐漸變慢。經過這麼我的時間我設法進入任務管理器只看到許多python.exe進程選項卡下。在嘗試結束某些過程後,我的鼠標停止移動。這是我第二次被迫重啓。
我太害怕嘗試第三個例子......

運行 - 英特爾(R)酷睿(TM)i7處理器870 @ 2.93GHz處理器(8個CPU),〜2.9GHz上的win7 64

如果有人知道這個問題是什麼,並且可以提供一個非常簡單的多處理示例(發送一個字符串也是一個多進程,修改它並將其發送回打印),我將非常感激。

+4

就像一個很好的舊叉炸彈:) http://en.wikipedia.org/wiki/Fork_bomb – Krumelur 2012-01-06 14:38:13

+2

我真的很喜歡這個問題。雖然可能只是Schadenfreude:D – 2012-01-06 14:40:29

回答

9

the docs

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

因此,在Windows上,則必須換一個

if __name__=='__main__': 

塊中的代碼。


例如,這發出了一個字符串的工作進程,字符串反轉,結果被主工藝印刷:

import multiprocessing as mp 

def worker(inq,outq): 
    obj = inq.get() 
    obj = obj[::-1] 
    outq.put(obj) 

if __name__=='__main__': 
    inq = mp.Queue() 
    outq = mp.Queue() 

    p = mp.Process(target=worker, args=(inq,outq)) 
    p.start() 

    inq.put('Fancy Dan') 

    # Wait for the worker to finish 
    p.join() 
    result = outq.get() 
    print(result) 
+0

是的,我會承認我拿出了那一點。我不知道這是如此重要。謝謝。我會接受這個答案。如果你有時間回答另一個問題...... do_something(self):在其中有一個打印語句......但是當我運行該腳本時沒有返回,爲什麼? – Rhys 2012-01-06 14:35:58

+0

哦,你是快速和徹底的謝謝 – Rhys 2012-01-06 14:39:39

+0

你是否嘗試過運行Ethan Furman的固定版本的代碼?它應該打印'('Process-1','Fancy Dan')'。 – unutbu 2012-01-06 14:43:01

4

,因爲這樣multiprocessing適用於Windows(子進程導入__main__模塊)__main__模塊在導入時不能實際運行任何代碼 - 直接運行時應執行的代碼必須受到if __name__ == '__main__'慣用法的保護。您的更正後的代碼:

import multiprocessing 

class MyFancyClass(object): 

    def __init__(self, name): 
     self.name = name 

    def do_something(self): 
     proc_name = multiprocessing.current_process().name 
     print(proc_name, self.name) 


def worker(q): 
    obj = q.get() 
    obj.do_something() 


if __name__ == '__main__': 
    queue = multiprocessing.Queue() 

    p = multiprocessing.Process(target=worker, args=(queue,)) 
    p.start() 

    queue.put(MyFancyClass('Fancy Dan')) 

    # Wait for the worker to finish 
    queue.close() 
    queue.join_thread() 
    p.join() 
+0

謝謝,對。你剛剛比unutbu – Rhys 2012-01-06 14:42:49

0

我可能會建議this link?它使用線程而不是多處理,但許多原則是相同的。

+0

晚了一點,謝謝,我已經在使用線程,但是在提高處理速度方面證明它非常無效。這就是爲什麼我正在研究多處理 – Rhys 2012-01-06 14:41:36