programing

비동기의수면 대 시간.잠을 자다, 잠을 자다, 잠을 자다, 잠을 보다

javajsp 2023. 5. 14. 10:21

비동기의수면 대 시간.잠을 자다, 잠을 자다, 잠을 자다, 잠을 보다

내가 갈 때asyncio페이지, 첫번째 예는 헬로 월드 프로그램입니다.파이썬에서 실행할 때3.73일반적인 것과 다른 점이 전혀 보이지 않습니다. 누가 차이점을 알려주시고 간단한 예를 들어주실있나요?

In [1]: import asyncio
   ...:
   ...: async def main():
   ...:     print('Hello ...')
   ...:     await asyncio.sleep(5)
   ...:     print('... World!')
   ...:
   ...: # Python 3.7+
   ...: asyncio.run(main())
Hello ...
... World!

In [2]:

In [2]: import time
   ...:
   ...: def main():
   ...:     print('Hello ...')
   ...:     time.sleep(5)
   ...:     print('... World!')
   ...:
   ...: # Python 3.7+
   ...: main()
Hello ...
... World!

일부러 시간을 1초에서 5초로 늘려서, 뭔가 특별한 것을 보고 싶지만 그러지 않았습니다.

코드에 비동기 작업이 많지 않기 때문에 특별한 내용은 표시되지 않습니다.하지만, 가장 큰 차이점은time.sleep(5)차단 중입니다.asyncio.sleep(5)비선택 사항입니다.

언제time.sleep(5)이 호출되면 스크립트의 전체 실행이 차단되고 아무것도 하지 않고 보류 상태가 됩니다.하지만 당신이 전화할 때await asyncio.sleep(5)대기문이 실행을 완료하는 동안 이벤트 루프에 다른 것을 실행하도록 요청합니다.

여기 개선된 예가 있습니다.

import asyncio

async def hello():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

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

asyncio.run(main())

Will 출력:

~$ python3.7 async.py
Hello ...
Hello ...
... World!
... World!

보다시피await asyncio.sleep(1)스크립트 실행을 차단하지 않습니다.

반대로, 라인 교체await asyncio.sleep(1)와 함께time.sleep(1)출력은 다음과 같습니다.

Hello ...
... World!
Hello ...
... World!

왜냐면time.sleep차단 중이며 의 첫 번째 호출입니다.hello()의 두 번째 통화 전에 먼저 끝내야 합니다.hello()실행을 시작합니다.

시간이 지나면.아래 sleep(1)은 1초마다 실행되며, 1초마다 실행됩니다.

import asyncio
import time

async def test1():
    for _ in range(0, 3):
        print('Test1')
        time.sleep(1) # Here
        
async def test2():
    for _ in range(0, 3):
        print('Test2')
        time.sleep(1) # Here
    
async def main():
    await asyncio.gather(test1(), test2()) # Here

asyncio.run(main())

따라서 실행하는 데 총 6초가 소요됩니다.

Test1 # 1 second
Test1 # 2 seconds
Test1 # 3 seconds
Test2 # 4 seconds
Test2 # 5 seconds
Test2 # 6 seconds

비동기식으로.아래에서 sleep(1)하며, 1초마다 교대로 실행됩니다.

import asyncio

async def test1():
    for _ in range(0, 3):
        print('Test1')
        await asyncio.sleep(1) # Here
        
async def test2():
    for _ in range(0, 3):
        print('Test2')
        await asyncio.sleep(1) # Here
    
async def main():
    await asyncio.gather(test1(), test2()) # Here

asyncio.run(main())

따라서 실행에 걸리는 시간은 총 3초입니다.

Test1 # 1 second
Test2 # 1 second
Test1 # 2 seconds
Test2 # 2 seconds
Test1 # 3 seconds
Test2 # 3 seconds

그리고 시간이 지나면.아래 sleep(0)은 한 번에 실행된 다음 한 번에 실행됩니다.

import asyncio
import time

async def test1():
    for _ in range(0, 3):
        print('Test1')
        time.sleep(0) # Here
        
async def test2():
    for _ in range(0, 3):
        print('Test2')
        time.sleep(0) # Here
    
async def main():
    await asyncio.gather(test1(), test2()) # Here

asyncio.run(main())

따라서 실행하는 데 0초가 소요되며 총 실행 시간은 다음과 같습니다.

Test1 # 0 second
Test1 # 0 second
Test1 # 0 second
Test2 # 0 second
Test2 # 0 second
Test2 # 0 second

그리고 비동기식으로.아래에서 sleep(0)이며, 교대로 한 번에 실행됩니다.

import asyncio

async def test1():
    for _ in range(0, 3):
        print('Test1')
        await asyncio.sleep(0) # Here
        
async def test2():
    for _ in range(0, 3):
        print('Test2')
        await asyncio.sleep(0) # Here
    
async def main():
    await asyncio.gather(test1(), test2()) # Here

asyncio.run(main())

따라서 실행에 걸리는 시간은 단 0초이며, 총 실행 시간은 다음과 같습니다.

Test1 # 0 second
Test2 # 0 second
Test1 # 0 second
Test2 # 0 second
Test1 # 0 second
Test2 # 0 second

마지막으로 시간 없이.수면 시간 또는 비동기.아래 sleep(sleep)은 먼저 한 번에 실행된 다음 한 번에 실행됩니다.

import asyncio

async def test1():
    for _ in range(0, 3):
        print('Test1')
        
async def test2():
    for _ in range(0, 3):
        print('Test2')
    
async def main():
    await asyncio.gather(test1(), test2()) # Here

asyncio.run(main())

따라서 실행하는 데 0초가 소요되며 총 실행 시간은 다음과 같습니다.

Test1 # 0 second
Test1 # 0 second
Test1 # 0 second
Test2 # 0 second
Test2 # 0 second
Test2 # 0 second

언급URL : https://stackoverflow.com/questions/56729764/asyncio-sleep-vs-time-sleep