결정적인 방식으로 파이썬의 비동기 함수 시작하기

4950 단어 pythonasyncasyncio
최근에 파이썬에서 여러 작업을 실행해야 하는 문제가 있었습니다. 문제는 각 작업이 더 작은 작업으로 구성되어 있고 그 중 하나는 외부 서비스를 기다리고 있다는 것입니다.

세 가지 작업이 있다고 가정해 보겠습니다.

   task_A:           task_B:           task_C:
+------------+    +------------+    +------------+
|            |    |            |    |            |
|    A_1     |    |    B_1     |    |    C_1     |
|            |    |            |    |            |
+------------+    +------------+    +------------+
|            |    |            |    |            |
|   A_wait   |    |   B_wait   |    |   C_wait   |
|            |    |            |    |            |
+------------+    +------------+    +------------+
|            |    |            |    |            |
|    A_2     |    |    B_2     |    |    C_2     |
|            |    |            |    |            |
+------------+    +------------+    +------------+

Tasks A_1 , B_1 , C_1 , A_2 , B_2 , C_2 는 우리가 실제로 실행하고 싶은 것이지만, 우리는 또한 작업들 사이에 일정 시간 동안 기다려야 합니다. 작업 A_wait , B_wait , C_wait .

우리가 이것들을 순서대로 실행한다면

+-------+  +-----------------------+  +-------+
|       |  |                       |  |       |
|  A_1  |  |         A_wait        |  |  A_2  |
|       |  |                       |  |       |
+-------+  +-----------------------+  +-------+

                                                 +-------+  +-----------------------+  +-------+
                                                 |       |  |                       |  |       |
                                                 |  B_1  |  |         B_wait        |  |  B_2  |
                                                 |       |  |                       |  |       |
                                                 +-------+  +-----------------------+  +-------+

                                                                                                  +-------+  +-----------------------+  +-------+
                                                                                                  |       |  |                       |  |       |
                                                                                                  |  C_1  |  |         C_wait        |  |  C_2  |
                                                                                                  |       |  |                       |  |       |
                                                                                                  +-------+  +-----------------------+  +-------+

소스가 포함된 요지는 다음과 같습니다.




즉, 예를 들어 각 대기는 1분 동안 지속되며 총 대기 시간은 3분이 됩니다. 그리고 다른 작업을 추가하면 이 시간은 4분이 됩니다.



대신 task_B가 완료되기를 기다리는 동안 A_wait 실행을 시작할 수 있고 B_wait 를 누르면 task_C 시작할 수 있습니다. 그렇게 하면 다른 작업을 추가한 후에도 대기 시간을 총 1분으로 줄일 수 있습니다.



이것이 바로 파이썬의 asyncio 모듈을 사용하여 할 수 있는 일입니다. 이를 통해 비동기 코드를 작성할 수 있습니다.



내가 달성하고자 하는 실행 순서는 다음과 같습니다.




+-------+  +-----------------------+  +-------+
|       |  |                       |  |       |
|  A_1  |  |         A_wait        |  |  A_2  |
|       |  |                       |  |       |
+-------+  +-----------------------+  +-------+

           +-------+  +-----------------------+  +-------+
           |       |  |                       |  |       |
           |  B_1  |  |         B_wait        |  |  B_2  |
           |       |  |                       |  |       |
           +-------+  +-----------------------+  +-------+

                      +-------+  +-----------------------+  +-------+
                      |       |  |                       |  |       |
                      |  C_1  |  |         C_wait        |  |  C_2  |
                      |       |  |                       |  |       |
                      +-------+  +-----------------------+  +-------+


여기에 첫 번째 시도가 있습니다:




<스크립트 아이디="gist-ltag"src="https://gist.github.com/serpent7776/c235953f74ae194bd1c183b4815dc219.js?file=demo1.py"/>


기본적으로 작업을 async로 정의하고 다른 비동기 호출에서 수행await해야 합니다. 우리의 경우 1분 동안 지속되는 대기 호출입니다. 이렇게 하면 현재 비동기 작업이 일시 중단되고 다음 작업이 시작됩니다.



이 코드의 문제는 작업이 실행되는 순서가 정의되어 있지 않다는 것입니다. 따라서 실행할 첫 번째 작업은 task_C 일 수 있으며 우리는 알 수 없습니다.

다행히도 작업이 실행되기를 원하는 순서를 지정하는 방법이 있습니다. 우리가 해야 할 일은 실행을 위해 예약하려는 순서대로 Task 개체를 생성하는 것입니다.




<스크립트 아이디="gist-ltag"src="https://gist.github.com/serpent7776/c235953f74ae194bd1c183b4815dc219.js?file=demo2.py"/>


이를 통해 예측 가능한 작업 스케줄링으로 작업을 비동기식으로 실행할 수 있습니다.

좋은 웹페이지 즐겨찾기