Compte tenu de ce programme Python:Processus Python multiprocessing.Queue +: terminer correctement les deux programmes
# commented out code are alternatives I tried that don't work.
from multiprocessing import Process, Queue
#from multiprocessing import Process, JoinableQueue as Queue
def start_process(queue):
# queue.cancel_join_thread()
while True:
print queue.get()
if __name__ == '__main__':
queue = Queue()
# queue.cancel_join_thread()
process = Process(target=start_process, args=(queue,))
process.start()
queue.put(12)
process.join()
Quand je tue ce programme avec CTRL-C
, cela se produit:
$> python queuetest.py
12
^CTraceback (most recent call last):
File "queuetest.py", line 19, in <module>
process.join()
File ".../python2.7/multiprocessing/process.py", line 119, in join
res = self._popen.wait(timeout)
Process Process-1:
File ".../python2.7/multiprocessing/forking.py", line 122, in wait
Traceback (most recent call last):
return self.poll(0)
File ".../python2.7/multiprocessing/forking.py", line 107, in poll
pid, sts = os.waitpid(self.pid, flag)
File ".../python2.7/multiprocessing/process.py", line 232, in _bootstrap
KeyboardInterrupt
self.run()
File ".../python2.7/multiprocessing/process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "queuetest.py", line 9, in start_process
print queue.get()
File ".../python2.7/multiprocessing/queues.py", line 91, in get
res = self._recv()
KeyboardInterrupt
.. comment puis-je bien terminer les deux processess sur le signal? Ce que je veux réaliser: Dans mon programme non-minimal, le second processus contient un SocketServer et nécessite une interface de ligne de commande interactive supplémentaire.
http://bugs.python.org/issue8237 semble très similaire, mais semble être sur les files d'attente pleines. Besoin d'une solution de contournement cependant. – peritus