Цикл событий доступа в другом процессе

#python

#Python

Вопрос:

Если у меня есть 2 процесса python, первый — скрипт, который вечно запускает цикл событий asyncio, а второй — сервер HTTP API, есть ли способ получить доступ к циклу событий первого процесса, чтобы добавлять к нему задачи из конечных точек сервера API?

Например, пользователь обращается /api/example , и это добавило бы задачу, например, using loop.call_soon() в цикл событий.

Возможно ли это, когда 2 процесса выполняются полностью отдельно?

Ответ №1:

Это невозможно.

Я мог бы представить (в зависимости от того, что именно вы хотите и каковы именно эти задачи) некоторые хитрости / обходные пути:

Одно из решений, которое вы могли бы попробовать, заключается в том, что между двумя процессами существует соединение (например, TCP-соединение, процесс asyncio, действующий как TCP-сервер, HTTP-сервер, действующий как клиент), где HTTP-сервер отправляет достаточно информации на сервер asyncio для создания задачи и добавления ее в свойЦикл событий.

Другим вариантом может быть то, что http-сервер создает файл python с кодом для выполнения, уведомляет сервер asyncio через TCP-соединение или через сигнал (например, сигнал HUP), чтобы проверить в данном каталоге наличие нового файла, импортировать его и добавить в свой цикл.

С точки зрения безопасности оба решения немного сложны, поскольку любой, кто может записать файл в определенный каталог, или любой, кто может подключиться к сокету TCP, может вызвать действие.

Но все зависит от вашего контекста.

Или вы могли бы попытаться запустить сервер HTTP API как поток в том же процессе, что и ваш процесс asyncio?

Комментарии:

1. Текущий обходной путь, который я использую, запускает процесс, при котором у меня нет ручного управления циклом, но есть доступ к циклу. Затем я использую функцию других процессов set_event_loop для первого цикла. Это позволяет им обоим получить к нему доступ, но это никоим образом не кошерно.

2. Я не уверен, что понимаю, вы говорите о процессах или о потоках? На данный момент я не вижу, как ваш обходной путь может даже работать. циклы событий — это объекты в ОЗУ, каждый процесс должен иметь свои собственные переменные, поэтому я ожидаю, что set_event_loop() , возможно, вы могли бы опубликовать небольшой пример своего обходного пути в своем вопросе?