Asyncio и поток в Python - PullRequest
       12

Asyncio и поток в Python

0 голосов
/ 21 сентября 2019

Я хочу использовать async в python, например, c # или javascript. Например, я хочу, чтобы моя программа не блокировала следующие коды или кнопки в приложении при отправке запроса. Я написал об этом некоторый код. Однако я не знаю, используется ли этоЭто правда или ложь. Я не могу понять asyncio

import asyncio
import threading
import time

async def waitForMe(name):
    for i in range(5):
        await asyncio.sleep(1)
        print(name)

async def main():
    task1 = asyncio.create_task(waitForMe("task1"))
    task2 = asyncio.create_task(waitForMe("task2"))
    task3 = asyncio.create_task(waitForMe("task3"))
    await task1
    await task2
    await task3

def mfunction():   
    asyncio.run(main())
t1=threading.Thread(target=mfunction)
t1.start()
for i in range(3):
    time.sleep(1)
    print("main")

1 Ответ

0 голосов
/ 24 сентября 2019

Я бы порекомендовал это превосходное прохождение асинцио, которое должно ответить на большинство ваших вопросов.

Цитата из упомянутой статьи в свете вашего кода:

[...] async IO представляет собой однопоточный однопроцессный проект: в нем используется совместная многозадачность, термин, который [...] дает ощущение параллелизма, несмотря на использование одного потока в одном процессе.

Если вы не хотите, чтобы ваша программа блокировала во время обработки (IO) запросов (как указано в вашем вопросе), параллелизма достаточно (и вам не нужна многопоточность)!

Параллельность [...] предполагает, что несколько задач могут запускаться с перекрытием.

Я повторю точный пример из упомянутой статьи, структура которой аналогична вашему примеру:

#!/usr/bin/env python3
# countasync.py

import asyncio

async def count():
    print("One")
    await asyncio.sleep(1)
    print("Two")

async def main():
    await asyncio.gather(count(), count(), count())

if __name__ == "__main__":
    import time
    s = time.perf_counter()
    asyncio.run(main())
    elapsed = time.perf_counter() - s
    print(f"{__file__} executed in {elapsed:0.2f} seconds.")

Это работает следующим образом:

$ python3 countasync.py
One
One
One
Two
Two
Two
countasync.py executed in 1.01 seconds.

Обратите внимание, что в этом примере используется asyncio.gather для запуска трех count() процессов неблокирующим образом.Размещение трех await count() операторов друг за другом не сработает.

Насколько я вижу, это точно , что вы ищете.Как показано, вам не нужно threading, чтобы достичь этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...