2017-03-16 9 views
0

프로세스를 RPi 입력을 지속적으로 모니터링하고, 디 바운스 된 값을 반영하기 위해 변수를 설정했습니다 (큐를 선택했습니다). 그러면 다른 프로세스가 스트림에서 이미지를 캡처합니다. 필자는 멀티 프로세싱과 시그널링 (queue)을 수행 할 수 있는지 확인하기 위해 몇 가지 코드를 작성했습니다. (나는 성숙한 코더입니다 ...).파이썬 3 : 멀티 프로세싱, EOFError : 라인을 읽을 때의 EOF

모두 스레드와 함께 제대로 작동하지만 멀티 프로세싱은 이상한 오류가 발생합니다. 특히 '다중 처리, 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 

이 모듈은 '포트'(I는 입력으로 키보드를 사용하고 있습니다) 모니터 :이 모듈은 상태를 모니터링

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

참고 : try :를 test4.py의 입력문에 추가하려고 시도했음을 유의하십시오.이 경우 "crash없이 무언가를 입력하고 True가 핵심어입니다."라는 인쇄가 계속됩니다.

나는, 그것을 해결하기 위해 야생 시도 잠금을 추가 차이

누구나 이런 일이 왜 어떤 생각을하지 않는다?

답변

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 독자를 혼합하는 것이 위험한 일이기 때문에 일반적입니다.

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

방금 ​​테스트 stdin를 사용하는 경우, 그 해결책은 간단하다 : 그러지 마 사실, 구현을 파고, multiprocessing/process.py 명시 적으로 stdindevnull에 설정합니다! 사용자 입력이 정말로 필요한 경우 인생은 좀 더 어려워집니다. 상위 큐에서 추가 대기열과 코드를 사용하여 사용자에게 프롬프트하고 입력을 얻을 수 있습니다.