Python:在python中创建子进程子进程的问题

时间:2012-06-11 10:57:47

标签: python queue subprocess multiprocessing

我在python,proc1.py和proc2.py中有两个文件,两者都是一个生产者,多个消费者场景的实现。 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()

1 个答案:

答案 0 :(得分:0)

不确定,但是因为看起来你在linux机器上运行Python 2.6,并且代码对我有用(使用windows机器和Python 2.7.3),你可能遇到{{ 3}}

你使用哪个python版本btw?