2017-03-16 10 views
0

を読むときにEOF私は絶えずRPI入力を監視し、プロセスを持っていることを望む、とデバウンス値を反映するために、TrueまたはFalseに(私はキューを選択している)変数を設定します。別のプロセスは、(ストリームから)イメージをキャプチャします。私はちょうど私がマルチプロセッシングおよびシグナリング(キュー)(私は...アマチュアコーダだ)OK作業を取得することができますチェックするためにいくつかのコードを書かれています。のPython 3:マルチプロセッシングは、例外EOFError:ライン

これは、すべてのスレッドで正常に動作しますが、マルチプロセッシングは奇妙なエラーを与えています。特に 'マルチプロセッシング、EOFError:行を読むときのEOF'。コード出力: -

this computer has the following number of CPU's 6 
OK, started thread on separate processor, now we monitor variable 
enter something, True is the key word: 
Process Process-1: 
Traceback (most recent call last): 
    File "c:\Python34\lib\multiprocessing\process.py", line 254, in _bootstrap 
    self.run() 
    File "c:\Python34\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Users\Peter\Documents\NetBeansProjects\test_area\src\test4.py", line 16, in Wait4InputIsTrue 
    ValueIs = input("enter something, True is the key word: ") 
EOFError: EOF when reading a line 

このモジュールは、「ポート」を監視し(私は、入力として、キーボードを使用しています):

#test4.py 
from time import sleep 
from multiprocessing import Lock 

def Wait4InputIsTrue(TheVar, TheLock): 
    while True: 
     sleep(0.2) 
     TheLock.acquire() 
     #try: 
     ValueIs = input("enter something, True is the key word: ") 
     #except: 
     # ValueIs = False 
     if ValueIs == "True": 
      TheVar.put(True) 
      print("changed TheVar to True") 
     TheLock.release() 

このモジュールは、ステータスを監視し、それに作用する:

私が試して追加しようとしている
#test5.py 
if __name__ == "__main__": 
    from multiprocessing import Process, Queue, Lock, cpu_count 
    from time import sleep 
    from test4 import Wait4InputIsTrue 

    print("this computer has the following number of CPU's", cpu_count()) 
    LockIt = Lock() 
    IsItTrue = Queue(maxsize = 3) 

    Wait4 = Process(target = Wait4InputIsTrue, args = (IsItTrue, LockIt)) 
    Wait4.start() 

    print("OK, started thread on separate processor, now we monitor variable") 

    while True: 
     if IsItTrue.qsize(): 
      sleep(0.1) 
      print("received input from separate thread:", IsItTrue.get()) 

注:それは印刷を続け、その場合にはtest4.pyで入力文に「何かを入力するには、Trueがキーワードです:」無期限に、CRなし。

私は、それを修正するために野生の試みでロックを追加しましたに違い

誰でもなぜこれが起こっている任意のアイデアを行うものではありませんか?

答えて

0
あなたの問題は、単純なスクリプトに煮詰めでき

:実行すると

import multiprocessing as mp 
import sys 

def worker(): 
    print("Got", repr(sys.stdin.read(1))) 

if __name__ == "__main__": 
    process = mp.Process(target=worker) 
    process.start() 
    process.join() 

、それがゼロバイトを読み込む

$ python3 i.py 
Got '' 

生成パイプが閉じていることを意味し、input(..)が向くEOFError例外へ。

multiprocessingモジュールは、あなたがstdinを読み聞かせしません。複数の子からstdin読者を混合することは危険なビジネスであるので、それは一般的に理にかなっています。実際には、実装に掘り、multiprocessing/process.pyが明示的にdevnullstdinを設定します。

   sys.stdin.close() 
       sys.stdin = open(os.devnull) 

あなただけのテストのためにstdinを使用している場合は、解決策は単純です:それをしないでください!実際にユーザーの入力が必要な場合、人生はかなり難しいです。追加のキューと親のコードを使用して、プロンプトを表示して入力を取得することができます。

関連する問題