#python-3.x #list #multiprocessing
#python-3.x #Список #многопроцессорная обработка
Вопрос:
У меня есть список заданий, но из-за определенного условия не все задания должны выполняться параллельно одновременно, потому что иногда важно, чтобы a завершалось до того, как я начну b или наоборот (на самом деле не важно, какой из них запускается первым, просто не то, что они выполняются одновременно), поэтомуя думал, что сохраняю список текущих запущенных потоков, и когда когда-либо запускается новый on, он проверяет в этом списке текущих запущенных потоков, может ли поток продолжаться или нет. Я написал для этого несколько примеров кода:
from time import sleep
from multiprocessing import Pool
def square_and_test(x):
print(running_list)
if not x in running_list:
running_list = running_list.append(x)
sleep(1)
result_list = result_list.append(x**2)
running_list = running_list.remove(x)
else:
print(f'{x} is currently worked on')
task_list = [1,2,3,4,1,1,4,4,2,2]
running_list = []
result_list = []
pool = Pool(2)
pool.map(square_and_test, task_list)
print(result_list)
этот код завершается UnboundLocalError: local variable 'running_list' referenced before assignment
ошибкой, поэтому я предполагаю, что мои потоки не имеют доступа к глобальным переменным. Есть ли способ обойти это? Если нет, есть ли другой способ решить эту проблему?
Комментарии:
1. Я не думаю, что это хороший подход к проблеме. Если вам нужно, чтобы они ждали вычислений, я думаю, было бы лучше использовать шаблон producer / consumer . Кроме того, являются ли ваши вычисления идемпотентными? в этом случае вам просто нужно как-то их кэшировать. Просто бросаю несколько идей здесь.
2. вы правы, это гораздо лучшее решение (шаблон производителя / потребителя)