AttributeError: объект '_MainProcess' не имеет атрибута '_exiting'
Я получил
AttributeError: '_MainProcess' object has no attribute '_exiting'
из приложения Python. К сожалению, этот код должен запускать Python 2.5 и, следовательно, модуль processing
в настоящее время известен как multiprocessing
. То, что я делал, - создать Process
с Queue
и put
элементом в очереди из основного процесса. Заглянув в код processing.queue
, я вижу, что поток фидера запускается. Этот поток фидера будет проверять currentProcess()._exiting
, но currentProcess()
оценивается как _MainProcess
, который не имеет указанного атрибута, как это видно в модуле processing.process
. Как это решить? Это ошибка в processing
? Если да, могу ли я просто обезвредить его с помощью currentProcess()._exiting = False
?
Минимальный пример:
#!/usr/bin/python
import processing
import processing.queue
class Worker(processing.Process):
def __init__(self):
processing.Process.__init__(self)
self.queue = processing.queue.Queue()
def run(self):
element = self.queue.get()
print element
if __name__ == '__main__':
w = Worker()
w.start()
# To trigger the problem, any non-pickleable object is to be passed here.
w.queue.put(lambda x: 1)
w.join()
Ответы
Ответ 1
Я не уверен, почему вы хотели бы раскрыть функцию в этом случае, если вы действительно хотите это сделать, посмотрите на этот ответ: Есть ли простой способ рассолить функция python (или иначе сериализует ее код)?
В противном случае это работает для python 2.6 (я знаю, что вы ищете 2.5, но у меня нет версии 2.5). Я заменил вашу лямбда-функцию обычной функцией и предоставил ее конструктору обработки:
from multiprocessing import Process, Queue
def simple():
return 1
class Worker(Process):
def __init__(self, args):
Process.__init__(self, args=args)
self.queue = Queue()
def run(self):
element = self.queue.get()
print element
if __name__ == '__main__':
w = Worker(args=[simple])
w.start()
w.join()