>  기사  >  백엔드 개발  >  Python의 asyncio 공통 함수를 사용하는 방법은 무엇입니까?

Python의 asyncio 공통 함수를 사용하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-04-26 20:10:061647검색

코루틴의 정의

비동기 def 문을 사용해야 합니다

코루틴이 할 수 있는 일:

1. 미래 결과를 기다립니다.

2. 다른 코루틴을 기다립니다(결과 생성 또는 예외 발생)

3 , 기다리고 있는 코루틴에 결과를 생성합니다

4. 기다리고 있는 코루틴에 예외를 발생시킵니다

코루틴 실행

코루틴 함수를 호출하면 코루틴이 실행되지 않고 그냥 반환됩니다. 코루틴 개체

코루틴 개체를 실행하는 방법에는 두 가지가 있습니다:

1. 이미 실행 중인 다른 코루틴에서 기다리려면 await를 사용하세요. await等待它

2、通过ensure_future函数计划它的执行

只有某线程的loop运行了,协程才可能运行

下面的例子:

先拿到当前线程缺省的loop,然后将协程对象交给loop.run_until_complete,协程对象随后会在loop里得到运行

loop = asyncio.get_event_loop()
loop.run_until_complete(do_some_work(3))

run_until_complete是一个阻塞调用,知道协程运行结束才返回

它的参数是一个future,但是我们传给它的却是协程对象,它在内部做了检查,通过ensure_future函数把协程对象包装成了future

我们可以这样写:

loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))

多个协程运行

多个协程在一个loop里运行,为了把多个协程交给loop,需要借助asyncio.gathre

2. >함수는 실행을 계획합니다

특정 스레드의 루프가 실행 중일 때만 코루틴이 실행될 수 있습니다

다음 예:

먼저 현재 스레드의 기본 루프를 가져온 다음 코루틴 개체를 루프에 전달합니다. run_until_complete, 그러면 코루틴 객체가 루프에서 실행됩니다

loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))

run_until_complete는 코루틴이 완료될 때까지 반환되지 않지만 해당 매개변수는 future입니다. is 코루틴 객체는 내부적으로 검사되고, verify_future 함수를 통해 코루틴 객체가 future로 패키징됩니다

다음과 같이 작성할 수 있습니다:

loop = asyncio.get_event_loop() #获取当前线程loop
coros_list = []
for i in range(2000):
    coros_list.append(main(i))
loop.run_until_complete(asyncio.gather(*coros_list))

Multiple coroutines run

여러 코루틴이 루프에서 실행됩니다. 루프에 코루틴을 추가하려면 asyncio.gathre 함수를 사용하거나(

loop = asyncio.get_event_loop() #获取当前线程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.run_until_complete(do_some_work(loop, 3))
loop.close()

) 먼저 코루틴 개체를 목록에 저장해야 합니다. 이는

loop = asyncio.get_event_loop() #获取当前线程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.close()
loop.run_until_complete(do_some_work(loop, 3))  # 此处异常

gather가 여러 future의 역할을 하는 경우입니다. loop.run_until_complete는 단일 future만 허용하기 때문에 단일 future로 래핑됩니다.

loop.close()에 대하여

간단히 말하면 루프가 닫히지 않는 한 계속 실행될 수 있습니다. :

def done_callback(futu):
    print('Done')
futu = asyncio.ensure_future(do_some_work(3))
futu.add_done_callback(done_callback)
loop.run_until_complete(futu)

그러나 닫혀 있으면 더 이상 실행할 수 없습니다.
asyncio.get_running_loop() # 返回当前os线程中正在运行的事件循环
asyncio.get_event_loop() # 获取当前事件循环
asyncio.set_event_loop(loop) # 获取当前事件循环
asyncio.new_event_loop() # 创建并返回一个新的事件循环对象

Callback

코루틴에 참여하는 것은 IO 읽기 작업입니다. 데이터 읽기가 완료된 후 데이터 처리의 다음 단계에 대한 알림을 받기를 바랍니다. . 이는 미래에 콜백을 추가하여 구현할 수 있습니다

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

이벤트 루프
  • 이벤트 루프는 비동기 작업과 콜백을 실행하고, 네트워크 IO 작업을 수행하고, 하위 프로세스를 실행합니다.

    asyncio 이벤트 루프 정책 문서에서 우리는 이벤트 루프 정책은 프로세스 전역 개체가 프로세스의 모든 이벤트 루프 관리를 제어합니다.
  • 프로세스의 전역 정책은 정책에 의해 제어되는 컨텍스트의 의미를 정의하고, 각 컨텍스트에서 별도의 이벤트 루프를 관리합니다. 기본 정책에 의해 정의된 컨텍스트는 현재 스레드이므로 다른 스레드는 다른 컨텍스트입니다. 다양한 이벤트 루프가 있습니다.

    이벤트 루프 가져오기
  • rrreee

asyncio.get_event_loop()

If: 🎜🎜🎜🎜현재 스레드가 메인 스레드입니다🎜🎜🎜🎜현재 스레드가 이벤트 루프를 시작하지 않습니다🎜🎜🎜🎜비동기 호출 이오 .get_event_loop ()메소드 모임 새로운 기본 이벤트 루프를 생성하고 현재 스레드의 이벤트 루프로 설정합니다. 🎜🎜현재 get_event_loop()는 다음과 같습니다. 🎜rrreee

위 내용은 Python의 asyncio 공통 함수를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제