Python gọi chức năng async đồng bộ

Nếu bạn chạy một hàm chỉ chặn và khiến Python đợi ở đó mà không sử dụng

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
1, thì nó sẽ ngăn Python nhảy qua lại giữa tất cả các hàm không đồng bộ đồng thời này, bởi vì nó sẽ chỉ đợi ở đó

Điều này được gọi để chặn vòng lặp sự kiện (vòng lặp sự kiện là thứ chạy các chức năng không đồng bộ lần lượt nhảy tại các điểm

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
1)

Hãy xem cách mà Asyncer's

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
3 có thể giúp bạn điều này

Chặn vòng lặp sự kiện¶

Trước tiên hãy xem một ví dụ bị hỏng

Đồng bộ hóa công việc¶

Hãy xem chức năng đồng bộ hóa (thông thường, chặn)

# 🚨 Don't use this, it will block the event loop! 🚨

import time

import anyio


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = do_sync_work(name="World")
    print(message)


anyio.run(main)
0

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇

👀 Xem trước tập tin đầy đủ

# 🚨 Don't use this, it will block the event loop! 🚨

import time

import anyio


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = do_sync_work(name="World")
    print(message)


anyio.run(main)

Chức năng này có thể nói chuyện với cơ sở dữ liệu, API từ xa, v.v. Nhưng nó không sử dụng

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
1, nó chỉ khiến Python đợi ở đó mà không có cảnh báo khi sử dụng
# 🚨 Don't use this, it will block the event loop! 🚨

import time

import anyio


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = do_sync_work(name="World")
    print(message)


anyio.run(main)
2

Mã đồng bộ hóa cuộc gọi từ Chặn mã không đồng bộ¶

Đây là vấn đề

Chúng ta hãy gọi chức năng đồng bộ hóa chậm (thông thường, chặn) đó trực tiếp từ bên trong mã async 😱

# 🚨 Don't use this, it will block the event loop! 🚨

import time

import anyio


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = do_sync_work(name="World")
    print(message)


anyio.run(main)

Bởi vì chức năng đó không phải là không đồng bộ, nhưng nó vẫn khiến Python chờ ở đó, nó sẽ cản trở bất kỳ mã không đồng bộ nào khác có thể đã được bắt đầu chạy. Tất cả sẽ phải đứng đó mà không làm gì cả, tốn thời gian tính toán. 😭

Sử dụng Asyncify¶

Trong những trường hợp bạn muốn chạy mã "đồng bộ" (đồng bộ, chặn) từ bên trong mã không đồng bộ theo cách tương thích với phần còn lại của mã không đồng bộ, bạn có thể sử dụng Asyncer's

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
3. 🚀

import time

import anyio
from asyncer import asyncify


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = await asyncify(do_sync_work)(name="World")
    print(message)


anyio.run(main)

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
3 nhận chức năng đồng bộ hóa (chặn) mà bạn muốn gọi và sau đó trả về một chức năng không đồng bộ khác nhận các đối số thực tế cho chức năng đồng bộ hóa ban đầu

Khi bạn gọi nó, Asyncer (sử dụng AnyIO) sẽ chạy chức năng đó theo cách không chặn vòng lặp sự kiện

Sau đó, bạn có thể

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
1 điều đó và nhận giá trị trả về đã được thực thi an toàn trong "luồng công nhân" mà không chặn vòng lặp sự kiện. 🎉

Lưu ý rằng bây giờ hàm

# 🚨 Don't use this, it will block the event loop! 🚨

import time

import anyio


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = do_sync_work(name="World")
    print(message)


anyio.run(main)
6 không phải là hàm
# 🚨 Don't use this, it will block the event loop! 🚨

import time

import anyio


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = do_sync_work(name="World")
    print(message)


anyio.run(main)
7

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇

👀 Xem trước tập tin đầy đủ

import time

import anyio
from asyncer import asyncify


def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"


async def main():
    message = await asyncify(do_sync_work)(name="World")
    print(message)


anyio.run(main)

nó thậm chí còn có một dòng

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
0

để mô phỏng hoạt động chặn (không sử dụng

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
1)

Đó có thể là đọc tệp, nói chuyện với cơ sở dữ liệu, v.v.

Nhưng

# Code above omitted 👆

def do_sync_work(name: str):
    time.sleep(1)
    return f"Hello, {name}"

# Code below omitted 👇
3 sẽ làm điều đúng đắn và chạy nó trên worker thread. Bằng cách này, bạn có thể trộn mã không đồng bộ với mã chặn dễ dàng hơn

Hỗ trợ đánh máy¶

Và tất nhiên, do cách thiết kế của Assyncer, bạn sẽ nhận được hỗ trợ gõ với các lỗi nội tuyến và tự động hoàn thành các đối số của hàm

Python gọi chức năng async đồng bộ

Và bạn cũng sẽ nhận được hỗ trợ gõ cho giá trị trả về

Python gọi chức năng async đồng bộ

Và nếu bạn đã sử dụng các công cụ như mypy, những công cụ đó cũng có thể sử dụng hỗ trợ đánh máy này để giúp bạn đảm bảo mã của mình chính xác và ngăn ngừa nhiều lỗi. 😎

Tôi có thể gọi hàm async từ Sync Python không?

Các hàm không đồng bộ có thể gọi trực tiếp các hàm đồng bộ hóa và nếu chức năng đồng bộ hóa đó chặn, thì hàm không đồng bộ sẽ gọi nó.

Python có đồng bộ hay không đồng bộ không?

Có hai loại phương thức cơ bản trong Parallels Python API. đồng bộ và không đồng bộ . Khi một phương thức đồng bộ được gọi, nó sẽ hoàn thành việc thực thi trước khi quay lại trình gọi. Một phương thức không đồng bộ bắt đầu một công việc ở chế độ nền và trả lại cho người gọi ngay lập tức.

Không đồng bộ có nhanh hơn đồng bộ hóa Python không?

Async không bị chặn, có nghĩa là nó sẽ gửi nhiều yêu cầu đến một máy chủ. Đồng bộ hóa đang chặn — nó sẽ chỉ gửi cho máy chủ một yêu cầu tại một thời điểm và sẽ đợi máy chủ trả lời yêu cầu đó. Async tăng thông lượng vì có thể chạy nhiều thao tác cùng lúc .

Bạn có thể đợi chức năng Python không đồng bộ không?

Vì vậy, có một quy tắc khá chắc chắn là bạn không thể sử dụng chức năng chờ trong chức năng không đồng bộ. Bất cứ khi nào asyncio quyết định rằng nó có đủ tài nguyên, nó sẽ gửi tin nhắn đó