2015-05-08 18 views
5

piton yazılı ve test edilmiş tüm kod 3.4 pencereler 7.Python çoklu işlem standart girdinin girdi

Ben bir konsol uygulaması tasarlama ve komutlarını vermek için ve değiştirmek için komut satırından (win os) den stdin'nin kullanmak için bir ihtiyaç vardı programın çalışma şekli. Program birden fazla işlemciye yaymak için cpu bağlı yüklerle başa çıkmak için çoklu işlemeye bağlıdır.

Bu durumu ve bazı temel dönüş bilgilerini izlemek için stdout kullanıyorum ve döndürülen konsol bilgilerine dayanarak farklı alt süreçleri yüklemek için komutlar verin.

Burada bir sorun buldum. Çok işlemcili modülün stdin girişlerini kabul etmesini sağlayamadım ama stdout gayet iyi çalışıyordu. Ben stack üzerinde aşağıdaki yardımı buldum düşünüyorum Bu yüzden ben test ve bu threak modülü ile tüm stdinli strep engelleme ile GIL kilidi nedeniyle her zaman stdin döngüsüne kadar tüm çıktıya duraklatılmış olduğu gerçeği hariç, tüm harika çalışır bulundu.

msvcrt.kbhit() ile uygulanan bir çalışma ile başarılı olduğumu söyleyebilirim. Bununla birlikte, stdin'i herhangi bir veri okumamasını sağlayan çoklu işleme özelliğinde bir çeşit hata olup olmadığını merak edemem. Sayısız yol denedim ve çok işlemciyi kullanırken hiçbir şey işe yaramadı. Kuyrukları kullanmayı bile denedim, ama havuzları veya çok işlemciden başka yöntemleri denemedim.

Ayrıca, bu makineyi çalışmayı denemeye odaklandığım için linux makinemde denemedim. Ben 'vermezse

import sys 
import time 
from multiprocessing import Process 

def function1(): 
    while True: 
     print("Function 1") 
     time.sleep(1.33) 

def function2(): 
    while True: 
     print("Function 2") 
     c = sys.stdin.read(1) # Does not appear to be waiting for read before continuing loop. 
     sys.stdout.write(c) #nothing in 'c' 
     sys.stdout.write(".") #checking to see if it works at all. 
     print(str(c)) #trying something else, still nothing in 'c' 
     time.sleep(1.66) 

if __name__ == "__main__": 
    p1 = Process(target=function1) 
    p2 = Process(target=function2) 
    p1.start() 
    p2.start() 

Umarım birileri bu tasarlanmış olup olmadığını işlevselliği ışık tutabilir: - Burada

amaçlanan (win7 bu Python 3.4 yazılmış hatırlatma) gibi işlemiyor test kodu basitleştirilmiştir t doğru bir şekilde veya başka bir yararlı bilgi biti.

Teşekkürler.

+0

[programlama Kuralları] (https://docs.python.org/3/ Örneğin, standart giriş genellikle tanımlayıcı 0, standart çıktı 1 ve standart hata 2 dosya olup library/multiprocessing.html # programlama yönergeleri) sys.stdin'in nasıl açılacağını açıklar (os.devnull) '. Böylece Win32 'NUL 'cihazından okuyorsunuz (yani NT' \ Device \ Null'). 'Function2''de sys.stdin = open (0)' olarak geri yükleyebilirsiniz. – eryksun

+0

Gerçekten de işe yarıyor. Ben os.devnull okuduğumda, bu durumu değiştirmek için bir şeyler yapmam gerektiğinden şüphe ettiğimde böyle basit bir şey olabileceğini hissettim. Yukarıdaki programı sys.stdin = include (2) fonksiyonundaki while döngüsünden hemen önce içerecek şekilde değiştirdim ve başarı elde ettim. Umarım diğerleri bu bilgiyi yararlı bulacaktır. Yardımınız için teşekkürler eryksun. – user2398421

cevap

4

Eğer multiprocessing.Process._bootstrap() ait piton uygulanması bakmak Bunu ne zaman göreceksiniz:

>>> import sys 
>>> import multiprocessing 
>>> def func(): 
...  print(sys.stdin) 
... 
>>> p = multiprocessing.Process(target=func) 
>>> p.start() 
>>> <_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'> 

Ve os.devnull okuma hemen boş sonucunu döndürür:

if sys.stdin is not None: 
    try: 
     sys.stdin.close() 
     sys.stdin = open(os.devnull) 
    except (OSError, ValueError): 
     pass 

Ayrıca kullanarak bu onaylayabilirsiniz:

>>> import os 
>>> f = open(os.devnull) 
>>> f.read(1) 
'' 

Bu konuda çalışabilirsiniz open(0) kullanılarak:

dosya bir dizge ya da byte ya da olmak için açılacak dosya veya dosyanın bir tamsayı dosya tanıtıcısının (geçerli çalışma dizinine mutlak ya da göreli) yol adı veren amacıdır. (Bir dosya tanıtıcı verilirse G/Ç nesnesi kapalıyken döndüğünde closefd False olarak ayarlanmadığı sürece, kapalıdır.)

Ve "0 file descriptor":

Dosya tanımlayıcılar gelen küçük tam sayılar Mevcut işlem tarafından açılan bir dosyaya.

>>> def func(): 
...  sys.stdin = open(0) 
...  print(sys.stdin) 
...  c = sys.stdin.read(1) 
...  print('Got', c) 
... 
>>> multiprocessing.Process(target=func).start() 
>>> <_io.TextIOWrapper name=0 mode='r' encoding='UTF-8'> 
Got a