2010-05-05 16 views
12

Aşağıdaki kodda bir sorun yaşıyorum ve alt işlemlerde print işlevini kullanan herhangi bir kodla. print yerine sys.std[err|out].write('worker') kullanmama rağmen basılı ifadeleri göremiyorum.Python çok işlemcili modülüyle oluşturulan alt süreçler yazdırılamayacak

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

çıkış boştur:

Bu

kodu (from the official python documentation) 'dir.

Not: Aşağıdaki kod parçacığı modülü kullanır ve çıktıyı baskı:

import threading 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = threading.Thread(target=f, args=('bob',)) 
    p.start() 
    p.join() 

Çıktı: hello bob

beni çözüme işaret edebilir? Şimdiden teşekkürler.

cevap

19

bu deneyin: multiprocessing modül tarafından olurken işlenir standart çıkış tamponlu edilir AFAIK tampon dolduğunda veya size sys.stdout açıkça floş yalnızca

from multiprocessing import Process 
import sys 

def f(name): 
    print 'hello', name 
    sys.stdout.flush() 

... 

, dolayısıyla çıkış göreceksiniz.

+0

Teşekkürler Tamas, ama bu benim durumumda işe yaramadı ... – John

+0

Hangi platformdasınız? Yukarıdakiler Mac OS X'te benim için; Aslında, sys.stdout kızarmadan bile çalışır. –

+1

Tamas, üzerinde çalıştığım platform win32. Bu arada, bugüne kadar kodu IDLE içinde çalıştırmayı denedim. Bugün bu sözdizimini kullanarak komut satırından çalıştırmayı denedim: python.exe my_prog.py ve çalıştı. Herkes nedenini biliyor mu? Ve IDLE içindeki programları çalıştırarak yazdırma çıktısını nasıl görüntüleyebilirim? – John

3

Çok işlemcili dokümanlar açık bir şekilde why'u açıklıyor bu işe yaramaz!

"Not: Bu paket içindeki işlevsellik, __main__ yönteminin çocuklar tarafından içe aktarılmasını gerektirir.Bu, Programlama yönergeleri kapsamındadır, ancak burada dikkat çekmeye değerdir.Bu, çoklu işlem gibi bazı örneklerin anlamına gelir. etkileşimli yorumlayıcıda çalışmıyor. "

+0

cevabıdır Her şeyden önce cevap için teşekkürler. Yaptığım şey, kodu "example.py" adlı bir dosyaya yazmak ve çalıştırmak için F5'e basmak. Belki bu "IDLE içinde kod çalıştırma" anlamına gelir? PS: Ben bir python newbie, ben burada belirttiğim herhangi bir (aşırı) bariz bir şey için çok üzgünüm. – John

+0

Ah, iyi evet ">>" istemi ile IDLE etkileşimli bir yorumlayıcı olarak sayar. Bu nedenle, bir dosyada kodu yazmazsanız ve komut satırına "python example.py" yazdığınızda F5'e basmazsanız veya çok fazla işlem yapılmazsa, çok işlemcili çalışmaz. Bunun nasıl kafa karıştırıcı bir konu olabileceğini anlayabiliyorum. Rica ederim. – manifest

-2

PyCharm'ı edinin, Aynı hatayı aldım ve üzerinde +5 saat çalıştım. Sonunda Anaconda üzerinde Pycharm aldım ve çıktı aldım. IPhython yorumlayıcısının windows sürümü ile ilgili bir şey var.

İlgili konular