Многопроцессорность Python блокирует внутри асинхронной функцииPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Многопроцессорность Python блокирует внутри асинхронной функции

Сообщение Гость »

У меня есть неасинхронный код, который выполняется в асинхронной функции.
По сути, это преобразования ast.NodeTransformer.

Код: Выделить всё

def is_lgf_in_tree(tree: ast.Expression) -> bool:
"""Walk tree while lgf call is not found"""
for n in ast.walk(tree):
if (
isinstance(n, ast.Call)
and isinstance(n.func, ast.Name)
and n.func.id == "lgf"
):
return True
return False

def transform(lgf: LGF, nested_lgfs: dict[str, LGF]) -> Tuple[LGF, ast.Expression]:
transformer = LGFTransformer(nested_lgfs=nested_lgfs)
tree = ast.parse(lgf.expression, mode="eval")

while is_lgf_in_tree(tree):  # make flat layer by layer
tree = transformer.visit(tree)

return lgf, tree
На случай, если код NodeTransformer может помочь

Код: Выделить всё

class LGFTransformer(ast.NodeTransformer):
def __init__(self, nested_lgfs: Dict[str, LGF]):
super().__init__()
self.nested_lgfs = nested_lgfs

def visit_Call(self, node: ast.Call):
if not isinstance(node.func, ast.Name):
return self.generic_visit(node)
if not (node.func.id == "lgf" and len(node.args) == 2 and len(node.keywords) == 0):
return self.generic_visit(node)
if not isinstance(node.args[0], ast.Constant):
return self.generic_visit(node)

_args = [arg.value for arg in node.args if isinstance(arg, ast.Constant)]
lgf = self.nested_lgfs.get(node.args[0].value, None)
if not lgf:
return node

exp = ast.parse(lgf.expression, mode="eval")
return exp.body
Пример простого кода

Код: Выделить всё

    results = []
for lgf in initial_lgfs:
results.append(transform(lgf, lgfs_by_name))
Изображение
Пример моей попытки выполнить многопроцессорную обработку

Код: Выделить всё

    from multiprocess.pool import Pool
arguments = [(lgf, lgfs_by_name) for lgf in initial_lgfs]
with Pool(processes=4) as pool:
results = pool.starmap(transform, arguments)
Изображение
Моя идея состоит в том, чтобы запустить модуль ast параллельно, чтобы сократить время вычислений.
Результаты для меня неприятны. Что я могу изменить/поэкспериментировать, чтобы преобразовать несколько функций с помощью ast.NodeTransformer.
Почему эти новые процессы пытаются ждать друг друга. Это потому, что я делюсь общими данными? Или проблема в асинхронной функции?
Может ли Deepcopy решить эту проблему?
Чего мне не хватает и почему он пытается синхронизировать процессы?
РЕДАКТИРОВАТЬ: Я понял, что эта огромная задержка вызвана процессом создания материала.
Есть ли способ минимизировать эти накладные расходы? Я пытался изменить метод создания процесса «вилка» на «порождение», но это не помогло

Источник: https://stackoverflow.com/questions/781 ... c-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»