1

Pythonにはproc1.pyとproc2.pyの2つのファイルがあります。どちらも、1つのプロデューサー、複数のコンシューマーのシナリオの実装です。メインのproc1は、子プロセスを作成します。各子プロセスで、proc2を呼び出します。コード内のproc2は、子プロセスも作成します。proc2.pyは、コマンドラインから実行すると正しく機能します。しかし、proc1から呼び出されると、エラーが発生します

Traceback (most recent call last):
  File "./proc2.py", line 20, in proc2WorkerFunc
    elem = q.get(block = False)
  File "/usr/lib64/python2.6/multiprocessing/queues.py", line 103, in get
    if not self._poll(block and (deadline-time.time()) or 0.0):
IOError: [Errno 9] Bad file descriptor

オンラインで検索してみましたが、今のところ手がかりがありません。私が間違っていることについてのアイデアはありますか?Proc1.pyは

def workerFunc(q):                                                                   
  while True:                                                                        
    try:
      elem = q.get(block = False)                                                    
      print elem
      subprocess.call(["./proc2.py"])                                                
      time.sleep(0.5)
    except Queue.Empty:
      print "Queue is empty"                                                         
      return                                                                         
    except:
      print "Exception happened"
      tb = traceback.format_exc()                                                    
      print tb                                                                       
      return                                                                         




if __name__ == '__main__':
  q = multiprocessing.Queue()                                                        
  for i  in range(1):                                                                
    q.put('Hello')                                                                   

  num_workers = 1                                                                    
  workers = []
  for i in range(num_workers):
    qWorker = multiprocessing.Process(target=workerFunc, args=(q,))                  
    qWorker.start()
    workers.append(qWorker)                                                          

  for worker in workers:                                                             
    worker.join()
  print "proc 1 has finished"

proc2.py:

def proc2WorkerFunc(q):
  while True:
    try:
      print q.qsize()
      elem = q.get(block = False)
      print elem
      time.sleep(0.5)
    except Queue.Empty:
      print "Queue is empty"
      return
    except:
      print "Exception happened"
      tb = traceback.format_exc()
      print tb
      return




if __name__ == '__main__':
  proc2Q = multiprocessing.Queue()
  for i  in range(100):
    proc2Q.put('World')

  num_workers = 10
  workers = []
  for i in range(num_workers):
    qWorker = multiprocessing.Process(target=proc2WorkerFunc, args=(proc2Q,))
    qWorker.start()
    workers.append(qWorker)

  for worker in workers:
    worker.join()
4

1 に答える 1

0

確かなことはわかりませんが、LinuxマシンでPython 2.6を実行していて、コードが(WindowsマシンとPython 2.7.3を使用して)機能しているように見えるので、このバグに遭遇する可能性があります。

正確にどのPythonバージョンを使用していますか?

于 2012-06-11T11:25:28.480 に答える