Hướng dẫn get return value from async function python - nhận giá trị trả về từ python hàm async

Đã hỏi 5 năm, 7 tháng trước 5 years, 7 months ago

Đã xem 38k lần 38k times

29

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi có ứng dụng bình sau:

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]

@app.route['/']
def test[]:
    loop = asyncio.get_event_loop[]
    res = loop.run_until_complete[run[]]
    return json.dumps[[dict[r] for r in res]] 

if __name__ == '__main__':
    app.run[]

Khi tôi chạy mã này, tôi đã nhận được

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
5. Làm thế nào để trả lại
async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
6 của tôi được chuyển đổi thành JSON?

Đã hỏi ngày 16 tháng 3 năm 2017 lúc 11:16Mar 16, 2017 at 11:16

Bạn cần trả về các giá trị của mình trong hàm

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
7 của mình để chúng có sẵn trong
async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
8:

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values

Đã trả lời ngày 16 tháng 3 năm 2017 lúc 11:35Mar 16, 2017 at 11:35

PitpitPit

3.1261 Huy hiệu vàng26 Huy hiệu bạc33 Huy hiệu đồng1 gold badge26 silver badges33 bronze badges

3

Trong chương cuối, tôi đã chỉ cho bạn cách sử dụng

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
9 để chạy nhiều chức năng ASYNC đồng thời.

Chúng tôi đã viết một số mã để gọi một số chức năng Async với một số đối số sớm, đồng thời.async functions with some arguments soon, concurrently.

Nhưng điều gì xảy ra nếu bạn muốn truy xuất giá trị trả lại từ các hàm Async đó sau khi chúng được chạy?retrieve the return value from those async functions after they are run?

Tôi sẽ chỉ cho bạn cách làm điều đó ở đây. 🤓

Chức năng không trả lại

Chúng ta hãy xem ví dụ cuối cùng

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
0 Chức năng Async mà chúng ta đã sử dụng trong chương trước:

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇

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

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]

Hàm này lấy một tham số

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
1 và sau đó nó in một tin nhắn.

Nhưng nó không bao giờ trả lại bất cứ điều gì [tương đương với việc trả lại

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
2].never returns anything [which is equivalent to returning
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
2].

Trả về giá trị Bur

Nhưng bây giờ chúng ta hãy nói rằng chúng ta không thực sự muốn chức năng đó in trực tiếp tin nhắn, chỉ để trả về chuỗi.return the string.

Có thể bởi vì chúng ta có thể muốn làm một cái gì đó khác sau này với giá trị, hoặc vì bất kỳ lý do nào khác:

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    message = f"Hello, {name}"
    return message

# Code below omitted 👇

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

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    message = f"Hello, {name}"
    return message


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        soon_value1 = task_group.soonify[do_work][name="Yury"]
        soon_value2 = task_group.soonify[do_work][name="Nathaniel"]
        soon_value3 = task_group.soonify[do_work][name="Alex"]

    data = [soon_value1.value, soon_value2.value, soon_value3.value]
    return data


async def main[]:
    data = await get_data[]
    for message in data:
        print[message]


anyio.run[main]

Lưu trữ đối tượng
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3

Khi bạn sử dụng:

task_group.soonify[async_function][arg1, arg2]

... Cuộc gọi đó trả về một đối tượng đặc biệt [một thể hiện của lớp

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3] mà bạn có thể lưu trữ trong một biến:returns a special object [an instance of a class
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3] that you can store in a variable:

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    message = f"Hello, {name}"
    return message


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        soon_value1 = task_group.soonify[do_work][name="Yury"]
        soon_value2 = task_group.soonify[do_work][name="Nathaniel"]
        soon_value3 = task_group.soonify[do_work][name="Alex"]

# Code below omitted 👇

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

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    message = f"Hello, {name}"
    return message


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        soon_value1 = task_group.soonify[do_work][name="Yury"]
        soon_value2 = task_group.soonify[do_work][name="Nathaniel"]
        soon_value3 = task_group.soonify[do_work][name="Alex"]

    data = [soon_value1.value, soon_value2.value, soon_value3.value]
    return data


async def main[]:
    data = await get_data[]
    for message in data:
        print[message]


anyio.run[main]

Nhận giá trị trả về từ
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 đối tượng

Khi một trong các hàm Async này bắt đầu với kết thúc

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
6, giá trị trả về của hàm được lưu trữ bên trong đối tượng
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3, trong thuộc tính
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8:return value of the function is stored inside the
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 object, in the attribute
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8:

# Code above omitted 👆

async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        soon_value1 = task_group.soonify[do_work][name="Yury"]
        soon_value2 = task_group.soonify[do_work][name="Nathaniel"]
        soon_value3 = task_group.soonify[do_work][name="Alex"]

    data = [soon_value1.value, soon_value2.value, soon_value3.value]
    return data

# Code below omitted 👇

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

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    message = f"Hello, {name}"
    return message


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        soon_value1 = task_group.soonify[do_work][name="Yury"]
        soon_value2 = task_group.soonify[do_work][name="Nathaniel"]
        soon_value3 = task_group.soonify[do_work][name="Alex"]

    data = [soon_value1.value, soon_value2.value, soon_value3.value]
    return data


async def main[]:
    data = await get_data[]
    for message in data:
        print[message]


anyio.run[main]

Hàm này lấy một tham số

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
1 và sau đó nó in một tin nhắn.task group will wait for all of the concurrent functions/tasks to finish before any code below is executed.

Nhưng nó không bao giờ trả lại bất cứ điều gì [tương đương với việc trả lại

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
2].finished, and the
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 objects will contain the return value already.

Trả về giá trị Bur

Nhưng bây giờ chúng ta hãy nói rằng chúng ta không thực sự muốn chức năng đó in trực tiếp tin nhắn, chỉ để trả về chuỗi.Asyncer is designed, you will get typing support in these

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 objects and their
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8 attribute.

Có thể bởi vì chúng ta có thể muốn làm một cái gì đó khác sau này với giá trị, hoặc vì bất kỳ lý do nào khác:autocompletion:

👀 Xem trước tệp đầy đủinline errors:

Lưu trữ đối tượng

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3infer this type information, you will also get type support down the line in anything that uses these values.

Khi bạn sử dụng:

... Cuộc gọi đó trả về một đối tượng đặc biệt [một thể hiện của lớp

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3] mà bạn có thể lưu trữ trong một biến:

👀 Xem trước tệp đầy đủinferred.

Nhận giá trị trả về từ

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 đối tượngtyping support also means that you can use tools like mypy to verify that your code is correct and prevent many bugs.

Khi một trong các hàm Async này bắt đầu với kết thúc
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
6, giá trị trả về của hàm được lưu trữ bên trong đối tượng
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3, trong thuộc tính
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8:

Sau khi khối

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
9, nhóm tác vụ sẽ chờ tất cả các chức năng/tác vụ đồng thời kết thúc trước khi bất kỳ mã nào bên dưới được thực thi.inside the
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
9 block, you will normally get an error:

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
1

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

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
2

Hàm này lấy một tham số

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
1 và sau đó nó in một tin nhắn.

Nhưng nó không bao giờ trả lại bất cứ điều gì [tương đương với việc trả lại

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
2].

Trả về giá trị Burtask group. And by that point, none of those async functions have been run yet.

Nhưng bây giờ chúng ta hãy nói rằng chúng ta không thực sự muốn chức năng đó in trực tiếp tin nhắn, chỉ để trả về chuỗi.an implicit

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]
6.

Có thể bởi vì chúng ta có thể muốn làm một cái gì đó khác sau này với giá trị, hoặc vì bất kỳ lý do nào khác:run any async code that is pending [in this case, the async functions you passed to

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
6]. It will wait for that to finish before continuing below.

👀 Xem trước tệp đầy đủall the async functions were already called and awaited, all the

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 objects will have their
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8 attributes available.

Lưu trữ đối tượng

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3

Khi bạn sử dụng:

... Cuộc gọi đó trả về một đối tượng đặc biệt [một thể hiện của lớp

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3] mà bạn có thể lưu trữ trong một biến:run pending async code at those
import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]
6 points [including the async functions you passed to
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
6].

👀 Xem trước tệp đầy đủcould have their value available, even inside of the

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
9 block.

Nhận giá trị trả về từ

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
3 đối tượng

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
3

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

async def run[]:
   conn = await asyncpg.connect[db_url]
   values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
   await conn.close[]
   return values
4

Ở đây chúng tôi có một

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]
6 bên trong khối
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
9. Nó ngủ trong 2 giây.2 seconds.

Bởi vì đó là một

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]
6, nó sẽ bảo Python đi và chạy bất kỳ mã async đang chờ xử lý nào khác.run any other pending async code.

Vì vậy, Python sẽ chạy [hoặc ít nhất là bắt đầu] chức năng Async đang chờ xử lý mà chúng tôi đã truyền đến

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
6.

2 giây là nhiều hơn những gì chức năng sẽ mất để hoàn thành vì nó đã đợi trong 1 giây bên trong. Vì vậy, sau đó

import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]
6, thuộc tính
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8 sẽ có sẵn.2 seconds is more than what the function will take to finish because it waited for 1 second inside. So, after that
import anyio
import asyncer


async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        task_group.soonify[do_work][name="Yury"]
        task_group.soonify[do_work][name="Nathaniel"]
        task_group.soonify[do_work][name="Alex"]


async def main[]:
    await get_data[]


anyio.run[main]
6, the
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
8 attribute will be available.

Chúng tôi xác minh rằng trước tiên, kiểm tra xem

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    message = f"Hello, {name}"
    return message


async def get_data[]:
    async with asyncer.create_task_group[] as task_group:
        soon_value1 = task_group.soonify[do_work][name="Yury"]
        soon_value2 = task_group.soonify[do_work][name="Nathaniel"]
        soon_value3 = task_group.soonify[do_work][name="Alex"]

# Code below omitted 👇
2 là
task_group.soonify[async_function][arg1, arg2]
4, và sau đó chúng tôi có thể in giá trị một cách an toàn.

Mẹo

Nếu bạn cảm thấy bạn cần truy cập các giá trị được tạo bởi các hàm Async bên trong cùng một khối

# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
9 cho một nhóm tác vụ, ví dụ, bạn có thể cần sử dụng một cách tiếp cận khác với các luồng Anyio.access values generated by the async functions inside the same
# Code above omitted 👆

async def do_work[name: str]:
    await anyio.sleep[1]
    print[f"Hello, {name}"]

# Code below omitted 👇
9 block for a task group, you might need to use a different approach, for example, with AnyIO Streams.

Hàm Async có thể trả về một giá trị không?

Các hàm ASYNC cho phép chúng tôi viết mã dựa trên lời hứa như thể nó đồng bộ, nhưng không chặn luồng thực thi. Nó hoạt động không đồng bộ thông qua vòng lặp sự kiện. Các hàm ASYNC sẽ luôn trả về một giá trị.Async functions will always return a value.

Asyncio thu thập lợi nhuận nào?

Asyncio.Gather [] trả về kết quả của các thiết bị chờ đợi như một tuple với cùng thứ tự như bạn chuyển các thiết bị đang chờ cho chức năng.the results of awaitables as a tuple with the same order as you pass the awaitables to the function.

Làm thế nào để bạn gọi một hàm async trong python?

Để chạy chức năng Async [Coroutine], bạn phải gọi nó bằng cách sử dụng vòng lặp sự kiện.Các vòng lặp sự kiện: Bạn có thể nghĩ về vòng lặp sự kiện là các chức năng để chạy các tác vụ và cuộc gọi lại không đồng bộ, thực hiện các hoạt động IO mạng và chạy các quy trình con.Ví dụ 1: Vòng lặp sự kiện Ví dụ để chạy chức năng Async để chạy một hàm Async duy nhất: Python3.call it using an Event Loop. Event Loops: You can think of Event Loop as functions to run asynchronous tasks and callbacks, perform network IO operations, and run subprocesses. Example 1: Event Loop example to run async Function to run a single async function: Python3.

Asyncio Python là gì?

Asyncio là một thư viện để viết mã đồng thời bằng cách sử dụng cú pháp Async/Await.Asyncio được sử dụng làm nền tảng cho nhiều khung không đồng bộ của Python cung cấp mạng hiệu suất cao và máy chủ web, thư viện kết nối cơ sở dữ liệu, hàng đợi nhiệm vụ phân tán, v.v.a library to write concurrent code using the async/await syntax. asyncio is used as a foundation for multiple Python asynchronous frameworks that provide high-performance network and web-servers, database connection libraries, distributed task queues, etc.

Bài Viết Liên Quan

Chủ Đề