Я ищу способ облегчить мой многопоточный код.
В моем коде много мест, где я делаю что-то вроде:
for arg in array:
t=Thread(lambda:myFunction(arg))
t.start()
Т.е. запуск одной и той же функции, каждый раз для разных параметров, в потоках.
Это, конечно, упрощенная версия реального кода, и обычно код внутри цикла for
имеет длину ~ 10-20 строк, что нельзя сделать простым, если использовать одну вспомогательную функцию, например myFunction
в примере выше (если бы это было так, я мог бы просто использовать пул потоков).
Кроме того, этот сценарий очень, очень распространен в моем коде, поэтому есть тонны строк, которые я считаю избыточными. Мне бы очень помогло, если бы мне не нужно было обрабатывать весь этот шаблонный код, но вместо этого я мог бы сделать что-то вроде:
for arg in array:
with threaded():
myFunction(arg)
т.е. каким-то образом threaded()
берет каждую строку кода внутри нее и запускает ее в отдельном потоке.
Я знаю, что контекстные менеджеры не должны использоваться в таких ситуациях, что это, вероятно, плохая идея и потребует безобразного взлома, но тем не менее - можно ли это сделать и как?