второе одновременное выполнение цикла for прерывает первый

1

Уже более года я использовал этот беспорядок для одновременного выполнения цикла 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", но я не уверен, так как я никогда не видел никаких ошибок. Это просто паузы или что-то в этом роде. Если кто-нибудь знает, в чем проблема, и как его можно настроить, так что было бы возможно выполнить несколько одновременных "циклов", я был бы рад прочитать их.

Теги:
python-3.x
exec

1 ответ

1
Лучший ответ

Вы должны использовать параметр 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()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню