python ProcessPoolExecutor работает в командной строке, но не запускается после добавления в функцию
это работает так
from concurrent import futures
def multi_process(func, paras, threads):
with futures.ProcessPoolExecutor(max_workers=threads) as pool:
res = pool.map(func, paras, chunksize=threads)
return list(res)
p = multi_process(func,paras,threads)
но не работает вообще, как показано ниже
def upper(paras,threads):
def func:
some func
def multi_process(func, paras, threads):
with futures.ProcessPoolExecutor(max_workers=threads) as pool:
res = pool.map(func, paras, chunksize=threads)
return list(res)
p = multi_process(func,paras,threads)
return p
p = upper(paras,threads)
никаких предупреждений или ошибок, но без ответа в течение длительного времени.






Вы получаете ошибку. Его.
AttributeError: Can't pickle local object 'upper.<locals>.func'.
Причина в том, что для работы многопроцессорной обработки необходимо, чтобы функция была определена на глобальном уровне.
Для достижения желаемого вы можете сделать следующее:
from concurrent import futures
# Has to be a global function
def func(para):
print(para)
def upper(paras,threads):
# This cannot be a local function.
#def func(para):
# print(para)
def multi_process(func, paras, threads):
with futures.ProcessPoolExecutor(max_workers=threads) as pool:
res = pool.map(func, paras, chunksize=threads)
return list(res)
p = multi_process(func, paras, threads)
return p
paras = [1, 2, 3]
threads = 3
p = upper(paras,threads)
да, это было бы причиной того, что вы не видите ошибок. Если это ответ на ваш вопрос, отметьте его как ответ, что поможет другим пользователям, которые просматривают этот вопрос.
Большое спасибо, теперь это действительно работает, на самом деле он не отвечает и не выдает никаких ошибок, возможно, потому что код выполняется в блокноте Jupyter.