AttributeError: у объекта _MainProcess нет атрибута _exiting - PullRequest
12 голосов
/ 11 ноября 2010

Я получил

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 Ответ

1 голос
/ 25 февраля 2011

Я не уверен, почему вы хотели бы выбрать функцию в этом случае, если вы действительно хотите сделать это, посмотрите на этот ответ: Есть ли простой способ выбрать функцию 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()
...