>백엔드 개발 >파이썬 튜토리얼 >Python 비동기 모듈을 사용하는 방법

Python 비동기 모듈을 사용하는 방법

PHPz
PHPz앞으로
2023-05-30 23:43:352243검색

마이크로 스레드라고도 알려진 코루틴은 사용자 모드에서 컨텍스트 전환을 위한 기술입니다. 즉, 실제로 실행을 위한 코드 블록 전환을 실현하는 스레드입니다. Python의 코루틴 지원은 생성기를 통해 구현됩니다.

생성기에서는 for 루프를 반복할 수 있을 뿐만 아니라 next() 함수를 지속적으로 호출하여 항복 문에서 반환된 다음 값을 얻을 수도 있습니다. Python의 Yield는 값을 반환하는 데 사용될 수 있을 뿐만 아니라 호출자가 전달한 매개 변수를 받을 수도 있습니다.

1. 생성기란 무엇인가요?

파이썬에서 생성기라는 메커니즘은 반복하면서 계산됩니다. 알고리즘을 제공한 다음 통화 중에 실제 값을 계산합니다.

생성기에서 값을 가져와야 할 때 next()를 사용할 수 있지만 일반적으로 값을 얻으려면 for 루프를 사용합니다.

생성기 구현 방법 생성기, ()를 사용하여

예: [1, 2, 3, 4, 5]를 나타냄, 생성기 메서드:

data = [1, 2, 3, 4, 5]
(x * x for x in len(data))

함수 정의 일부 논리적으로 복잡한 시나리오에서는 첫 번째 방법을 사용합니다. 메서드는 다음과 같습니다. 적합하지 않으므로 다음과 같이 유형 함수를 정의하는 방법이 있습니다.

def num(x):
    while (x < 10):
        print(x * x)
        x += 1
g = num(1)
for item in g:
    print(item)

함수에 Yield가 나타나면 이때 생성기가 됩니다.

def num(x):
    while (x < 10):
        yield x * x  # 返回结果,下次从这个地方继续?
        x += 1
g = num(1)  # 返回的是generator对象
for item in g:
    print(item)

next()가 호출될 때마다 실행되는 생성기 함수가 됩니다. , Yield 문을 만나면 반환되고, 다시 실행되면 마지막으로 반환된 Yield 문부터 실행을 계속합니다.

2. asyncio를 사용하여 비동기 io 구현

비동기 io는 이벤트 루프와 코루틴 함수를 통해 구현됩니다.

이벤트 루프는 내부 ​​작업을 지속적으로 모니터링하고 해당 작업이 있으면 실행합니다. 루프 작업을 처리합니다. 작업 목록이 비어 있으면 이벤트가 종료됩니다.

import asyncio
# 生成或获取事件循环对象loop;类比Java的Netty,我理解为开启一个selector
loop = asyncio.get_event_loop()  
# 将协程函数(任务)提交到事件循环的任务列表中,协程函数执行完成之后终止。
# run_until_complete 会检查协程函数的运行状态,并执行协程函数
loop.run_until_complete( func() )

test 데모

import asyncio
import time
async def test():
    print("io等待")
    await asyncio.sleep(1)
    return &#39;hello&#39;
async def hello():
    print("Hello world")
    r = await test()
    print("hello again")
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

Python 비동기 모듈을 사용하는 방법코루틴 함수: async def에 의해 수정된 함수입니다. def func()와 같은 일반 def와 비교하면 함수에서 반환한 값을 직접 받을 수 있지만 코루틴 함수 반환은 다음과 같습니다. 코루틴 객체.

코루틴 함수를 실행하려면 이 객체를 이벤트 루프에 넘겨 처리해야 합니다.

# 测试协程
import asyncio
import time, datetime
# 异步函数不同于普通函数,调用普通函数会得到返回值
# 而调用异步函数会得到一个协程对象。我们需要将协程对象放到一个事件循环中才能达到与其他协程对象协作的效果
# 因为事件循环会负责处理子程 序切换的操作。
async def Print():
    return "hello"
loop = asyncio.get_event_loop()
loop.run_until_complete(Print)

await:

사용법: 응답 = 대기 + 대기 가능한 객체

대기 가능 객체: 코루틴 객체, Future, Task 객체는 IO 대기로 이해될 수 있습니다

응답: 대기의 결과로 IO 작업이 발생합니다. 현재 코루틴(작업). 현재 코루틴이 일시 중지되면 이벤트 루프는 다른 코루틴(작업)을 실행할 수 있습니다. 참고: 대기 가능 개체가 코루틴 개체인 경우 작업 개체가 됩니다. 동시에 실행되면 이벤트 루프 목록에 여러 작업을 추가할 수 있습니다. `asyncio.create_task()`를 사용하여 `Task` 객체를 생성할 수 있으며 전달된 매개변수는 코루틴 객체

import asyncio
import time, datetime
async def display(num):
    pass
tasks = []
for num in range(10):
    tasks.append(display(num))  # 生成任务列表
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

asnyc이고 Wait는 새로운 구문이며 이전 버전은 @asyncio.coroutine 및 Yield from

입니다. 3. aiohttp

asyncio는 단일 스레드 동시 IO 작업을 구현할 수 있습니다. 클라이언트 측에서만 사용된다면 그다지 강력하지 않을 것입니다. 웹 서버와 같은 서버 측에서 asyncio를 사용하는 경우 HTTP 연결은 IO 작업이므로 단일 스레드 + 코루틴을 사용하여 여러 사용자에 대한 높은 동시성 지원을 달성할 수 있습니다.

aiohttp는 asyncio를 기반으로 하는 HTTP 프레임워크입니다.

요청처럼 get 요청과 같은 요청을 보낼 수 있습니다.

params 매개변수를 통해 전달될 매개변수를 지정할 수 있습니다

async def fetch(session):
    async with session.get("http://localhost:10056/test/") as response:
        data = json.loads(await response.text())
        print(data["data"])

Post request

    두 작업을 비동기식으로 실행
  • 네트워크 요청에서 요청은 다음과 같습니다. aiohttp는 ClientSession을 사용하여 세션을 관리합니다
  • session.method를 사용하여 요청을 보냅니다
  • 응답 정보 응답의 경우 status를 사용하여 응답 상태 코드를 가져오고, text()를 사용하여 응답 콘텐츠를 가져옵니다. ; text( )를 사용하여 인코딩 형식을 지정할 수 있습니다. 응답 결과를 기다리기 전에 response.text() 앞에 wait 키워드
  • async def init(num):
        async with aiohttp.ClientSession() as session:
            if num == 1:
                time.sleep(5)
            print("session begin", num)
            async with session.post("http://localhost:10056/hello/", data=json.dumps({"data": "hello"})) as response:
                print("client begin", num)
                data = json.loads(await response.text())
    
                print(data["data"])
            print("session end", num)
        print("other")
    if __name__ == &#39;__main__&#39;:
        loop = asyncio.get_event_loop()
        tasks = [init(1), init(2)]
        loop.run_until_complete(asyncio.wait(tasks))

를 추가해야 합니다.

위 내용은 Python 비동기 모듈을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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