Python multiprocessamento atexit erro "Erro na atexit._run_exitfuncs"

votos
7

Estou tentando executar uma simples aplicação de vários processos em Python. O segmento principal gera um para processos de N e espera até que tudo o que feito o processamento. Os processos cada executar um loop infinito, para que possam potencialmente ser executado para sempre sem alguma interrupção de usuário, então eu coloquei em algum código para lidar com uma KeyboardInterrupt:

#!/usr/bin/env python
import sys
import time
from multiprocessing import Process

def main():
    # Set up inputs..

    # Spawn processes
    Proc( 1).start()
    Proc( 2).start()

class Proc ( Process ):
    def __init__ ( self, procNum):
        self.id = procNum
        Process.__init__(self)

    def run ( self ):
        doneWork = False

        while True:

            try:
                # Do work...
                time.sleep(1)
                sys.stdout.write('.')

                if doneWork:
                    print PROC# + str(self.id) +  Done.
                    break

            except KeyboardInterrupt:
                print User aborted.
                sys.exit()

# Main Entry
if __name__==__main__:
    main()

O problema é que quando se usa CTRL-C para sair, eu recebo um erro adicional, embora os processos parecem sair imediatamente:

......User aborted.
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File C:\Python26\lib\atexit.py, line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File C:\Python26\lib\multiprocessing\util.py, line 281, in _exit_function
    p.join()
  File C:\Python26\lib\multiprocessing\process.py, line 119, in join
    res = self._popen.wait(timeout)
  File C:\Python26\lib\multiprocessing\forking.py, line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt
Error in sys.exitfunc:
Traceback (most recent call last):
  File C:\Python26\lib\atexit.py, line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File C:\Python26\lib\multiprocessing\util.py, line 281, in _exit_function
    p.join()
  File C:\Python26\lib\multiprocessing\process.py, line 119, in join
    res = self._popen.wait(timeout)
  File C:\Python26\lib\multiprocessing\forking.py, line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt

Estou executando o Python 2.6 no Windows. Se há uma maneira melhor de lidar com multiprocessamento em Python, por favor me avise.

Publicado 19/05/2009 em 16:13
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Em vez de apenas forçando sys.exit(), você quer enviar um sinal para os seus tópicos para dizer-lhes para parar. Olhar em usar manipuladores de sinais e fios em Python.

Você poderia fazer isso alterando o seu while True:ciclo para ser while keep_processing: onde keep_processingé algum tipo de variável global que fica situado na exceção KeyboardInterrupt. Eu não acho que esta é uma boa prática embora.

Respondeu 19/05/2009 em 16:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more