2013-01-05 14 views
13

Yeni başlayan öğrencilerim için bir kütüphaneyle uğraşıyorum ve Python'daki çoklu işlem modülünü kullanıyorum. Bir örnek olarak, importing and using a module that uses multiprocessing without causing infinite loop on WindowsPython'un çoklu işlem modülü, Windows'da yeni bir işlem başlatırken neden __main__ dosyasını içe aktarıyor?

Ben bir modül mylibrary.py olduğunu varsayalım: Bu sorunla karşılaştım ben main.py çalıştırırsanız

# main.py 

import mylibrary 

mylibrary.foo() 

:

# mylibrary.py 

from multiprocessing import Process 

class MyProcess(Process): 
    def run(self): 
     print "Hello from the new process" 

def foo(): 
    p = MyProcess() 
    p.start() 

Ve bu kütüphaneyi çağıran bir ana programı Windows, main.py'yi yeni sürece aktarmaya çalışır, bu da kodun tekrar yürütüldüğü anlamına gelir ve bu da sonsuz bir süreç oluşturma döngüsüyle sonuçlanır. Ben şöyle düzeltebilirim:

import mylibrary 

if __name__ == "__main__": 
    mylibrary.foo() 

Fakat, bu yeni başlayanlar için oldukça kafa karıştırıcı olduğunu ve gerekli olmamalıdır gibi üstelik görünüyor. Yeni işlem mylibrary'da oluşturuluyor, bu nedenle neden yeni süreç mylibrary'u içe aktarmıyor? main.py'u değiştirmek zorunda kalmadan bu soruna geçici bir çözüm bulmak için bir yol var mı?

Bu arada, Python 2.7 kullanıyorum.

cevap

23

Windows, fork ürününe sahip değil, bu nedenle mevcut olanı gibi yeni bir işlem yapmanın yolu yok. Bu nedenle, çocuk işleminin kodunuzu tekrar çalıştırması gerekiyor, ancak artık ana işlem ile alt işlem arasında ayrım yapmanın bir yoluna ihtiyacınız var ve __main__ budur.

Bu burada docs kaplıdır: Ben çatal bomba etkisini önlemek için kodu yapılandırmaya başka bir yolunu bilmiyorum http://docs.python.org/2/library/multiprocessing.html#windows

.

+4

Bu cevap kabul edilmelidir. – Marcin

+1

Eminim ki bir şey kaçırmıyorum, ama sorum şu ki, çocuk sürecinin bütün kodu tekrar çalıştırması gerekiyor. Neden sadece yeni süreci başlatan modül değil? – Laura

+0

@Laura: Tüm kodunuzu tekrar çalıştırmanız gerekiyor, çünkü eğer yapmadıysa kodunuz olmazdı. Çocuk süreci tamamen taze başlar ve eğer kendi fonksiyonlarınızı istiyorsanız, kodunuza ihtiyaç duyar. –