Я пытаюсь запустить несколько заданий параллельно.
Когда я определяю актера как функцию синхронизации, он использует разных исполнителей.
Но когда функции являются асинхронными он использует только один поток (рабочий).
Я вообще понимаю разницу между асинхронным параллелизмом и многопоточностью/multiprocessing, но есть ли способ использовать всех созданных рабочих процессов с асинхронными актерами?
Например, если вы ограничены библиотекой, которую вы используете внутри актера.
Однако я не считаю, что синхронизация актера и создание нового цикла событий внутри него являются элегантным решением.
Код, который я использую:
redis_broker = RedisBroker(
host=settings.redis_url,
port=settings.redis_port,
db=settings.redis_db,
password=settings.redis_password,
middleware=[CurrentMessage()] # with AsyncIO() in async case
)
dramatiq.set_broker(redis_broker)
Актер синхронизации:
@dramatiq.actor
def jobs(param: int):
logger.info(f"Started {param}")
time.sleep(param)
logger.info(f"Ended {param}")
Асинхронный актер:
@dramatiq.actor
async def jobs(param: int):
logger.info(f"Started {param}")
await asyncio.sleep(param)
logger.info(f"Ended {param}")
И я запускаю его как:
g = group([
jobs.send(1),
jobs.send(2),
jobs.send(3),
]).run()
Результаты синхронизации:
[2024-10-11 02:38:42,251] [PID 420038] [Thread-3] [dramatiq] [INFO] Started 3
[2024-10-11 02:38:42,251] [PID 420038] [Thread-5] [dramatiq] [INFO] Started 2
[2024-10-11 02:38:42,251] [PID 420038] [Thread-6] [dramatiq] [INFO] Started 3
[2024-10-11 02:38:42,252] [PID 420038] [Thread-7] [dramatiq] [INFO] Started 1
[2024-10-11 02:38:42,252] [PID 420038] [Thread-8] [dramatiq] [INFO] Started 2
[2024-10-11 02:38:42,252] [PID 420038] [Thread-4] [dramatiq] [INFO] Started 1
[2024-10-11 02:38:43,253] [PID 420038] [Thread-7] [dramatiq] [INFO] Ended 1
[2024-10-11 02:38:43,254] [PID 420038] [Thread-4] [dramatiq] [INFO] Ended 1
[2024-10-11 02:38:44,254] [PID 420038] [Thread-5] [dramatiq] [INFO] Ended 2
[2024-10-11 02:38:44,254] [PID 420038] [Thread-8] [dramatiq] [INFO] Ended 2
[2024-10-11 02:38:45,255] [PID 420038] [Thread-6] [dramatiq] [INFO] Ended 3
[2024-10-11 02:38:45,255] [PID 420038] [Thread-3] [dramatiq] [INFO] Ended 3
Асинхронные результаты:
[2024-10-11 02:50:03,245] [PID 422276] [Thread-1] [dramatiq] [INFO] Started 3
[2024-10-11 02:50:03,245] [PID 422276] [Thread-1] [dramatiq] [INFO] Started 2
[2024-10-11 02:50:03,245] [PID 422276] [Thread-1] [dramatiq] [INFO] Started 3
[2024-10-11 02:50:03,245] [PID 422276] [Thread-1] [dramatiq] [INFO] Started 1
[2024-10-11 02:50:03,245] [PID 422276] [Thread-1] [dramatiq] [INFO] Started 2
[2024-10-11 02:50:03,245] [PID 422276] [Thread-1] [dramatiq] [INFO] Started 1
[2024-10-11 02:50:04,246] [PID 422276] [Thread-1] [dramatiq] [INFO] Ended 1
[2024-10-11 02:50:04,246] [PID 422276] [Thread-1] [dramatiq] [INFO] Ended 1
[2024-10-11 02:50:05,247] [PID 422276] [Thread-1] [dramatiq] [INFO] Ended 2
[2024-10-11 02:50:05,247] [PID 422276] [Thread-1] [dramatiq] [INFO] Ended 2
[2024-10-11 02:50:06,246] [PID 422276] [Thread-1] [dramatiq] [INFO] Ended 3
[2024-10-11 02:50:06,246] [PID 422276] [Thread-1] [dramatiq] [INFO] Ended 3
Подробнее здесь: https://stackoverflow.com/questions/790 ... gle-worker
Похоже, что Dramatiq с asyncio работает только с одним работником. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Asyncio Async Funcitons вешает с Asyncio.gather. (Код работает без Asyncio.gather)
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-