Уже более года я использовал этот беспорядок для одновременного выполнения цикла for.
import time
#in actual program this is a dynamic dictionary with different amount of keys/values pairs
mydict = {1: 'czech', 2: 'dutch', 3: 'English'}
def function(id):
time.sleep(1)
print(mydict[id])
#if you try this code, you will see 'print' for all dictionary keys
#simultaneously, despite the fact that it a for loop with time.sleep
#the exec here creates new function with name from 'mydict' and connects
#it to a separate process
for id in mydict:
exec("""def func""" + str(id) + """():\n function(id)""")
exec("""p""" + str(id) + """ = Process(target=func""" + str(id) + """)\np""" + str(id) + """.start()""")
Но теперь, когда другая программа (даже с разным venv) пытается выполнить аналогичный код, первая программа, которая уже выполняет этот код, полностью ломается. Я думаю, что это вызвано ограничениями "exec", но я не уверен, так как я никогда не видел никаких ошибок. Это просто паузы или что-то в этом роде. Если кто-нибудь знает, в чем проблема, и как его можно настроить, так что было бы возможно выполнить несколько одновременных "циклов", я был бы рад прочитать их.
Вы должны использовать параметр args
для передачи аргументов целевой функции вместо использования exec
для создания операторов. Вы также должны добавить, if __name__ == '__main__':
чтобы ваш дочерний процесс не выполнял тот же код, что и только родительский процесс.
Замените цикл for
:
if __name__ == '__main__':
l = []
for id in mydict:
p = Process(target=function, args=(id,))
p.start()
l.append(p)
for i in l:
i.join()