#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()
, возможно, вы могли бы опубликовать небольшой пример своего обходного пути в своем вопросе?