2015-05-08 8 views
5

लिखा और अजगर पर परीक्षण सभी कोड 3.4 विंडोज़ 7अजगर बहु ​​stdin इनपुट

मैं एक सांत्वना अनुप्रयोग को डिजाइन किया गया था और आदेश जारी करने के लिए और बदलने के लिए कमांड लाइन (जीत ओएस) से stdin उपयोग करने के लिए की जरूरत थी कार्यक्रम के ऑपरेटिंग मोड। कार्यक्रम एकाधिक प्रोसेसर में फैलाने के लिए सीपीयू बाध्य भार से निपटने के लिए मल्टीप्रोसेसिंग पर निर्भर करता है।

मैं stdout का उपयोग कर रहा है कि स्थिति और मुद्दे पर कुछ बुनियादी वापसी की जानकारी और stdin पर नजर रखने के लिए लौट आए सांत्वना जानकारी के आधार पर अलग-अलग उप प्रक्रियाओं लोड करने के लिए आदेश देता है।

यह वह जगह है जहां मैं एक समस्या पाया। मैं मल्टीप्रोसेसिंग मॉड्यूल को stdin इनपुट स्वीकार करने के लिए नहीं मिला लेकिन stdout बस ठीक काम कर रहा था। मैं stack पर नीचे दी गई सहायता पाया लगता है तो मैं यह परीक्षण किया और पाया कि सूत्रण मॉड्यूल के साथ यह सब अच्छा काम करता है, तथ्य यह है कि stdout के लिए सभी उत्पादन जब तक हर बार stdin stdin अवरुद्ध साथ जीआईएल ताला की वजह से साइकिल है रोक दिया गया है के लिए छोड़कर।

मैं कहता हूँ कि मैं() के आसपास msvcrt.kbhit के साथ लागू किया एक काम के साथ सफल रहे हैं। हालांकि, मैं यह सोचने में मदद नहीं कर सकता कि मल्टीप्रोसेसिंग फीचर में कुछ प्रकार की बग है जो स्टडीन को किसी भी डेटा को नहीं पढ़ रही है। मैंने कई तरीकों की कोशिश की और मल्टीप्रोसेसिंग का उपयोग करते समय कुछ भी काम नहीं किया। यहां तक ​​कि कतारों का उपयोग करने का भी प्रयास किया, लेकिन मैंने पूल, या मल्टीप्रोसेसिंग से किसी भी अन्य तरीकों का प्रयास नहीं किया।

मैं अपने Linux मशीन पर इस कोशिश नहीं की क्योंकि मैं यह काम करने के लिए प्राप्त करने की कोशिश पर ध्यान केंद्रित किया गया था।

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() 

उम्मीद है कि किसी को प्रकाश इस करना है कि क्या कार्यक्षमता पर, शेड कर सकते हैं अगर मैं 'नहीं था: -

यहाँ परीक्षण कोड है कि इरादा (Win7 अनुस्मारक इस अजगर 3.4 में लिखा गया था) के रूप में काम नहीं करता सरल है इसे सही ढंग से लागू नहीं करते हैं, या जानकारी के कुछ अन्य उपयोगी बिट।

धन्यवाद।

+0

[प्रोग्रामिंग दिशानिर्देश] (https://docs.python.org/3/ लाइब्रेरी/multiprocessing.html # प्रोग्रामिंग-दिशानिर्देश) चर्चा करें कि कैसे sys.stdin' को खोलने के लिए सेट किया गया है (os.devnull) '। इस प्रकार आप Win32 'NUL' डिवाइस (यानी एनटी' \ डिवाइस \ Null') से पढ़ रहे हैं। 'Function2' में आप इसे' sys.stdin = open (0) 'के रूप में पुनर्स्थापित कर सकते हैं। – eryksun

+0

वास्तव में यह काम करता है। मुझे लगा कि यह कुछ आसान हो सकता है जब मैंने os.devnull पढ़ा मुझे संदेह था कि मुझे उस राज्य को बदलने के लिए कुछ करने की आवश्यकता हो सकती है। मैंने उपरोक्त प्रोग्राम को sys.stdin = open (0) को फ़ंक्शन 2 में थोड़ी देर पहले लूप से पहले और सफलता प्राप्त करने के लिए बदल दिया। उम्मीद है कि अन्य लोग यह जानकारी उपयोगी पाएंगे। आपकी सहायता eryksun के लिए धन्यवाद। – user2398421

उत्तर

4

जब आप multiprocessing.Process._bootstrap() का अजगर कार्यान्वयन पर एक नज़र डालें तो आप इस देखेंगे:

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

तुम भी उपयोग कर इस बात की पुष्टि कर सकते हैं:

>>> 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'> 

और os.devnull से पढ़ तुरंत खाली परिणाम देता है:

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

आप इसे चारों ओर काम कर सकते हैं open(0) का उपयोग करके:

फ़ाइल या तो एक स्ट्रिंग या बाइट्स पथ नाम दे रही है वस्तु है (पूर्ण या वर्तमान कार्यशील निर्देशिका के सापेक्ष) फ़ाइल खोले जाने के लिए या फ़ाइल के पूर्णांक फ़ाइल वर्णनकर्ता का होना लपेटा। (एक फ़ाइल वर्णनकर्ता दिया जाता है, तो यह है, जब लौटे आई/ओ वस्तु बंद कर दिया है बंद कर दिया है जब तक कि closefd गलत पर सेट है।)

और "0 file descriptor":

फ़ाइल वर्णनकर्ता छोटे इसी पूर्णांक हैं वर्तमान प्रक्रिया द्वारा खोला गया एक फ़ाइल में।उदाहरण के लिए, मानक इनपुट आमतौर पर फ़ाइल है वर्णनकर्ता 0, मानक आउटपुट 1 है, और मानक त्रुटि 2:

>>> 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 
संबंधित मुद्दे