Неожиданное поведение в цикле событий PythonPython

Программы на Python
Anonymous
Неожиданное поведение в цикле событий Python

Сообщение Anonymous »

У меня есть следующий фрагмент асинхронного кода на Python.

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

import asyncio

async def get_some_values_from_io():
print("Getsome value Executing...")
await asyncio.sleep(3)
return [100,200]

vals = []

async def fetcher():
while True:
print("Fetcher Executing...")
io_vals = await get_some_values_from_io()

for val in io_vals:
vals.append(io_vals)

async def monitor():
while True:
print("Monitor Executing...")
print (len(vals))

await asyncio.sleep(3)

async def main():
t1 = asyncio.create_task(fetcher())
t2 = asyncio.create_task(monitor())
await asyncio.gather(t1, t2)

asyncio.run(main())

print("Rest of the method is executing....")
Обе вызываемые асинхронные функции вызывают метод async.sleep() со значительным временем ожидания.
Пока обе они спят, последний оператор печати print("Rest метода выполняется...." должен быть запущен.
Но то, что печатается, это: (на самом деле оно просто продолжает работать)

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

Fetcher Executing...
Getsome value Executing...
Monitor Executing...
0
Fetcher Executing...
Getsome value Executing...
Monitor Executing...
2
...
Насколько я понимаю, все программы Python представляют собой всего лишь один поток (GIL), и цикл событий также будет использовать GIL. Разве это не правильно?
Кроме того, есть упоминания о методе run_in_executor(), который говорит, что задачи, связанные с ЦП, можно запускать с использованием этого метода вне цикла событий. То есть это означает, что помимо цикла событий параллельно работает еще один поток? Это противоречит факту GIL.

Подробнее здесь: https://stackoverflow.com/questions/783 ... event-loop

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