многопроцессорные перерывы в интерактивном режиме

#python #multiprocessing

#python #многопроцессорная обработка

Вопрос:

У меня есть следующий код

 from multiprocessing import Process, Queue
from queue import Empty
from time import sleep

def f(q):
    n = 100000000
    while n != 100000000 // 2:
        n -= 1
    q.put("the awkening!")
    print("my work here is done")

def main():
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    while True:
        try:
            print(q.get(block=False))
            raise systemexit
        except Empty:
            print("i found nothing :(")
            sleep(2)
    p.join()
  

Если я добавлю

 if __name__ == '__main__':
     main()
  

До конца, затем используйте python script_name.py для его запуска, все работает нормально. Однако, если я просто запускаю scirpt, используя python -i script_name.py then run main() Python жалуется:

 Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:Python34libmultiprocessingspawn.py", line 98, in spawn_main
    exitcode = _main(fd)
  File "C:Python34libmultiprocessingspawn.py", line 108, in _main
    self = pickle.load(from_parent)
AttributeError: Can't get attribute 'f' on <module '__main__' (built-in)>
  

Ошибка исходит от дочернего процесса, основной процесс работает нормально.

Это не имеет большого значения, но мне интересно, почему это происходит, также было бы неплохо, если бы он работал в интерактивном режиме

Ответ №1:

Документация по многопроцессорной обработке обсуждает это:

Примечание

Функциональность в этом пакете требует, чтобы дочерние элементы могли импортировать модуль __main__. Это описано в руководстве по программированию, однако здесь стоит указать. Это означает, что некоторые примеры, такие как многопроцессорная обработка.Примеры пула не будут работать в интерактивном интерпретаторе.

Насколько я понимаю, __main__ это определяется совсем по-другому в контексте интерактивного сеанса (поскольку оно связано с оболочкой, а не с запущенным файлом).