Đã 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
9 để chạy nhiều chức năng ASYNC đồng thời.async def run[]:
conn = await asyncpg.connect[db_url]
values = await conn.fetch['''SELECT ... FROM ... WHERE ...;''']
await conn.close[]
return values
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
# Code above omitted 👆
async def do_work[name: str]:
await anyio.sleep[1]
print[f"Hello, {name}"]
# Code below omitted 👇
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
# Code above omitted 👆
async def do_work[name: str]:
await anyio.sleep[1]
print[f"Hello, {name}"]
# Code below omitted 👇
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:
# Code above omitted 👆
async def do_work[name: str]:
await anyio.sleep[1]
print[f"Hello, {name}"]
# Code below omitted 👇
# Code above omitted 👆
async def do_work[name: str]:
await anyio.sleep[1]
print[f"Hello, {name}"]
# Code below omitted 👇
# Code above omitted 👆
async def do_work[name: str]:
await anyio.sleep[1]
print[f"Hello, {name}"]
# Code below omitted 👇
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
2Hà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
2].# Code above omitted 👆 async def do_work[name: str]: await anyio.sleep[1] print[f"Hello, {name}"] # Code below omitted 👇
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
6.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]
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 👇
3Khi 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
3
|
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.