Проблема в том, что вы звоните join
до close
.
multiprocess
, кажется, отсутствует документация , но, так какНасколько я могу судить, это в основном форк stdlib multiprocessing
, который предварительно monkeypatches dill
в для pickle
, так что документы multiprocessing
должны быть актуальны здесь.(Также в комментарии вы сказали, что можете воспроизвести проблему с помощью multiprocessing
.)
Итак, Pool.join
говорит:
Подождитедля рабочих процессов, чтобы выйти.Перед использованием join()
.
необходимо вызвать close()
или terminate()
. Метод close
- это то, как вы отключаете сторону отправки очереди, чтобы новые задачи не могли быть добавлены.Метод join
- это то, как вы ожидаете обработки всего в очереди.Ожидание истечения очереди до ее закрытия не будет работать.
Но вы звоните close
после join
, а не до.И первое, что join
делает , это assert
, который вы уже назвали close
или terminate
, которого у вас нет, следовательно, ошибка подтверждения.
ТакВы, вероятно, просто хотите изменить порядок этих двух вызовов.
Или, альтернативно, возможно, вы не понимали, для чего нужен join
, и подумали, что вам нужно позвонить до того, как вы сможете использовать all_responses.get()
или .wait()
.Если так - вам не нужно этого делать;get
будет блокироваться до тех пор, пока не станут доступны результаты, после чего вам не понадобится join
.На самом деле это чаще встречается, особенно у map
и друзей (хотя примеры в документации делают это через with Pool(…) as pool:
вместо ручного вызова чего-либо в пуле).