#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__
это определяется совсем по-другому в контексте интерактивного сеанса (поскольку оно связано с оболочкой, а не с запущенным файлом).