У меня есть задача в скрипте Python, который раньше был в основном привязан к вводу-выводу, поэтому я использовал ThreadPools, и все работало нормально. Теперь моя задача становится все более связанной с процессором, поэтому я хотел переключиться на пулы с несколькими процессами.
Я думал, что оба интерфейса ведут себя практически одинаково, поэтому я просто переключил импорт, и все готово. Однако внезапно моя рабочая функция больше не выполняется в пуле.
Попробовав пару вещей, это похоже на тот факт, что я передаю DirEntry из os.scandir () моей рабочей функции. При замене «записи» жестко запрограммированной строкой моя рабочая функция выполняется. Заменив обратно на вход, перестает работать. Заменив импорт на ThreadPool, он снова работает.
# This works.
from multiprocessing.pool import ThreadPool as Pool
import os
pool_size = 3
def worker(entry):
print("Did some useful stuff!")
pool = Pool(pool_size)
for entry in os.scandir("Samples/"):
if entry.is_file():
pool.apply_async(worker, (entry,))
pool.close()
pool.join()
print("Finished multiprocessing task.")
Вывод:
Did some useful stuff! (~150x)
Finished multiprocessing task.
Замените from multiprocessing.pool import ThreadPool as Pool
на from multiprocessing import Pool
, теперь я получаю только следующий результат:
Finished multiprocessing task.
Теперь, если я вставлю случайную строку вместо записи из цикла в pool.apply_async(worker, (entry,))
, например, pool.apply_async(worker, ("Why does this work?",))
, рабочая функция работает и возвращает тот же результат, что и ThreadPools, но, очевидно, с аргументом, который я не хочу использовать в моем фактическом скрипте.
Что тут происходит?