Thoát chức năng async python

Async IO là một thiết kế lập trình đồng thời đã nhận được hỗ trợ chuyên dụng trong Python, phát triển nhanh chóng từ Python 3. 4 đến 3. 7, và có lẽ hơn thế nữa

Bạn có thể đang nghĩ một cách sợ hãi, “Đồng thời, song song, phân luồng, đa xử lý. Đó là rất nhiều để nắm bắt rồi. IO không đồng bộ phù hợp ở đâu?”

Hướng dẫn này được xây dựng để giúp bạn trả lời câu hỏi đó, giúp bạn hiểu rõ hơn về cách tiếp cận của Python đối với IO không đồng bộ

Đây là những gì bạn sẽ bao gồm

  • IO không đồng bộ [async IO]. một mô hình [mô hình] bất khả tri về ngôn ngữ có triển khai trên nhiều ngôn ngữ lập trình

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3/
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4. hai từ khóa Python mới được sử dụng để xác định coroutines

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5. gói Python cung cấp nền tảng và API để chạy và quản lý các coroutine

Coroutines [hàm tạo chuyên dụng] là trung tâm của IO không đồng bộ trong Python và chúng ta sẽ đi sâu vào chúng sau

Ghi chú. Trong bài viết này, tôi sử dụng thuật ngữ IO không đồng bộ để biểu thị thiết kế bất khả tri về ngôn ngữ của IO không đồng bộ, trong khi

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 đề cập đến gói Python

Trước khi bắt đầu, bạn cần đảm bảo rằng mình đã thiết lập để sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 và các thư viện khác có trong hướng dẫn này

Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới

Thiết lập môi trường của bạn

Bạn sẽ cần Python 3. 7 trở lên để theo dõi toàn bộ bài viết này, cũng như các gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
8 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
9

$ python3.7 -m venv ./py37async
$ source ./py37async/bin/activate  # Windows: .\py37async\Scripts\activate.bat
$ pip install --upgrade pip aiohttp aiofiles  # Optional: aiodns

Để được trợ giúp cài đặt Python 3. 7 và thiết lập môi trường ảo, hãy xem Hướng dẫn cài đặt & thiết lập Python 3 hoặc Trình hướng dẫn môi trường ảo

Với điều đó, chúng ta hãy nhảy vào

Loại bỏ các quảng cáo

Chế độ xem 10.000 foot của Async IO

Async IO ít được biết đến hơn một chút so với những người anh em đã thử và đúng của nó, đa xử lý và phân luồng. Phần này sẽ cung cấp cho bạn bức tranh đầy đủ hơn về IO không đồng bộ là gì và cách nó phù hợp với bối cảnh xung quanh

Async IO phù hợp ở đâu?

Đồng thời và song song là những chủ đề mở rộng không dễ dàng thâm nhập vào. Mặc dù bài viết này tập trung vào async IO và việc triển khai nó trong Python, nhưng bạn nên dành một phút để so sánh async IO với các đối tác của nó để có bối cảnh về cách async IO phù hợp với câu đố lớn hơn, đôi khi chóng mặt

Song song bao gồm thực hiện nhiều hoạt động cùng một lúc. Đa xử lý là một phương tiện để thực hiện tính song song và nó kéo theo các tác vụ trải rộng trên các đơn vị xử lý trung tâm của máy tính [CPU hoặc lõi]. Đa xử lý rất phù hợp với các tác vụ liên quan đến CPU. các vòng lặp

$ python3 countsync.py
One
Two
One
Two
One
Two
countsync.py executed in 3.01 seconds.
0 bị ràng buộc chặt chẽ và các tính toán toán học thường thuộc loại này

Đồng thời là một thuật ngữ rộng hơn một chút so với song song. Nó gợi ý rằng nhiều tác vụ có khả năng chạy theo cách chồng chéo. [Có một câu nói rằng đồng thời không có nghĩa là song song. ]

Phân luồng là một mô hình thực thi đồng thời, theo đó nhiều luồng thay phiên nhau thực hiện các tác vụ. Một tiến trình có thể chứa nhiều luồng. Python có mối quan hệ phức tạp với luồng nhờ GIL của nó, nhưng điều đó nằm ngoài phạm vi của bài viết này

Điều quan trọng cần biết về phân luồng là nó tốt hơn cho các tác vụ liên kết với IO. Trong khi một tác vụ liên quan đến CPU được đặc trưng bởi các lõi của máy tính liên tục làm việc chăm chỉ từ đầu đến cuối, thì một công việc liên quan đến IO bị chi phối bởi rất nhiều thời gian chờ đầu vào/đầu ra hoàn thành

Tóm lại những điều trên, đồng thời bao gồm cả đa xử lý [lý tưởng cho các tác vụ liên kết với CPU] và phân luồng [phù hợp với các tác vụ liên kết với IO]. Đa xử lý là một dạng song song, với song song là một loại [tập hợp con] cụ thể của đồng thời. Thư viện chuẩn Python đã cung cấp hỗ trợ lâu dài cho cả hai thứ này thông qua các gói

$ python3 countsync.py
One
Two
One
Two
One
Two
countsync.py executed in 3.01 seconds.
1,
$ python3 countsync.py
One
Two
One
Two
One
Two
countsync.py executed in 3.01 seconds.
2 và
$ python3 countsync.py
One
Two
One
Two
One
Two
countsync.py executed in 3.01 seconds.
3

Bây giờ là lúc đưa một thành viên mới vào hỗn hợp. Trong vài năm qua, một thiết kế riêng biệt đã được tích hợp toàn diện hơn vào CPython. IO không đồng bộ, được kích hoạt thông qua gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 của thư viện tiêu chuẩn và các từ khóa ngôn ngữ
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 mới. Rõ ràng, IO không đồng bộ không phải là một khái niệm mới được phát minh và nó đã tồn tại hoặc đang được tích hợp vào các ngôn ngữ và môi trường thời gian chạy khác, chẳng hạn như Go, C# hoặc Scala

Gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 được lập hóa đơn bởi tài liệu Python như một thư viện để viết mã đồng thời. Tuy nhiên, async IO không phải là luồng, cũng không phải là đa xử lý. Nó không được xây dựng trên một trong hai

Trên thực tế, async IO là một thiết kế đơn luồng, một quy trình. nó sử dụng đa nhiệm hợp tác, một thuật ngữ mà bạn sẽ hiểu rõ ở phần cuối của hướng dẫn này. Nói cách khác, người ta nói rằng IO không đồng bộ mang lại cảm giác đồng thời mặc dù sử dụng một luồng đơn lẻ trong một quy trình. Các coroutine [một tính năng trung tâm của IO không đồng bộ] có thể được lên lịch đồng thời, nhưng chúng vốn không đồng thời

Xin nhắc lại, async IO là một kiểu lập trình đồng thời, nhưng nó không phải là song song. Nó được liên kết chặt chẽ hơn với luồng hơn là đa xử lý nhưng rất khác biệt so với cả hai điều này và là một thành viên độc lập trong túi thủ thuật đồng thời

Vậy là còn một nhiệm kỳ nữa. Điều đó có nghĩa là gì đối với một cái gì đó không đồng bộ?

  • Các quy trình không đồng bộ có thể "tạm dừng" trong khi chờ đợi kết quả cuối cùng của chúng và để các quy trình khác chạy trong thời gian chờ đợi
  • Mã không đồng bộ, thông qua cơ chế trên, tạo điều kiện thực thi đồng thời. Nói cách khác, mã không đồng bộ mang lại giao diện đồng thời

Đây là một sơ đồ để kết hợp tất cả lại với nhau. Các điều khoản màu trắng đại diện cho các khái niệm và các điều khoản màu xanh lá cây đại diện cho các cách mà chúng được triển khai hoặc thực hiện

Tôi sẽ dừng lại ở phần so sánh giữa các mô hình lập trình đồng thời. Hướng dẫn này tập trung vào thành phần con không đồng bộ IO, cách sử dụng nó và các API đã xuất hiện xung quanh nó. Để khám phá kỹ lưỡng về phân luồng so với đa xử lý so với IO không đồng bộ, hãy tạm dừng tại đây và xem tổng quan về đồng thời trong Python của Jim Anderson. Jim hài hước hơn tôi rất nhiều và đã ngồi trong nhiều cuộc họp hơn tôi.

Giải thích IO không đồng bộ

Async IO thoạt nghe có vẻ phản trực giác và nghịch lý. Làm thế nào để một cái gì đó tạo điều kiện cho mã đồng thời sử dụng một luồng và một lõi CPU?

Kiện tướng cờ vua Judit Polgár tổ chức một cuộc triển lãm cờ vua trong đó bà đấu với nhiều kỳ thủ nghiệp dư. Cô ấy có hai cách để tiến hành cuộc triển lãm. đồng bộ và không đồng bộ

giả định

  • 24 đối thủ
  • Judit thực hiện mỗi nước cờ trong 5 giây
  • Mỗi đối thủ mất 55 giây để di chuyển
  • Trò chơi có trung bình 30 nước đi đôi [tổng cộng 60 nước đi]

Phiên bản đồng bộ. Judit chơi một trò chơi tại một thời điểm, không bao giờ chơi hai trò chơi cùng một lúc, cho đến khi trò chơi kết thúc. Mỗi trò chơi mất [55 + 5] * 30 == 1800 giây hoặc 30 phút. Toàn bộ triển lãm mất 24 * 30 == 720 phút, hoặc 12 giờ

Phiên bản không đồng bộ. Judit di chuyển từ bàn này sang bàn khác, thực hiện một động tác ở mỗi bàn. Cô ấy rời khỏi bàn và để đối thủ thực hiện nước đi tiếp theo trong thời gian chờ đợi. Một nước đi trong tất cả 24 ván sẽ mất Judit 24 * 5 == 120 giây hoặc 2 phút. Toàn bộ triển lãm hiện được cắt giảm xuống còn 120 * 30 == 3600 giây, hoặc chỉ 1 giờ. [Nguồn]

Chỉ có một Judit Polgár, người chỉ có hai tay và chỉ tự mình thực hiện một động tác tại một thời điểm. Nhưng chơi không đồng bộ giảm thời gian triển lãm từ 12 giờ xuống còn một giờ. Vì vậy, đa nhiệm hợp tác là một cách thú vị để nói rằng vòng lặp sự kiện của chương trình [sẽ nói thêm về điều đó sau] giao tiếp với nhiều tác vụ để cho phép mỗi tác vụ lần lượt chạy vào thời điểm tối ưu

Async IO mất nhiều thời gian chờ đợi, trong đó các chức năng sẽ bị chặn và cho phép các chức năng khác chạy trong thời gian ngừng hoạt động đó. [Một chức năng chặn hiệu quả cấm những người khác chạy từ khi nó bắt đầu cho đến khi nó quay trở lại. ]

Loại bỏ các quảng cáo

IO không đồng bộ không dễ dàng

Tôi đã nghe nói rằng, “Hãy sử dụng IO không đồng bộ khi bạn có thể; . ” Sự thật là việc xây dựng mã đa luồng bền bỉ có thể khó khăn và dễ bị lỗi. Async IO tránh được một số lỗi tốc độ tiềm ẩn mà bạn có thể gặp phải với thiết kế theo luồng

Nhưng điều đó không có nghĩa là IO async trong Python rất dễ dàng. được cảnh báo. khi bạn mạo hiểm dưới mức bề mặt một chút, việc lập trình không đồng bộ cũng có thể khó khăn. Mô hình không đồng bộ của Python được xây dựng dựa trên các khái niệm như gọi lại, sự kiện, vận chuyển, giao thức và tương lai—chỉ thuật ngữ thôi cũng có thể khiến bạn sợ hãi. Thực tế là API của nó đã thay đổi liên tục khiến nó không dễ dàng hơn

May mắn thay,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 đã trưởng thành đến mức hầu hết các tính năng của nó không còn là tạm thời nữa, trong khi tài liệu của nó đã được đại tu lớn và một số tài nguyên chất lượng về chủ đề này cũng đang bắt đầu xuất hiện

Gói
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4

Bây giờ bạn đã có một số thông tin cơ bản về thiết kế IO không đồng bộ, hãy khám phá triển khai của Python. Gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 của Python [được giới thiệu trong Python 3. 4] và hai từ khóa của nó,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4, phục vụ các mục đích khác nhau nhưng kết hợp với nhau để giúp bạn khai báo, xây dựng, thực thi và quản lý mã không đồng bộ

Cú pháp
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 và các Coroutine bản địa

Một lời cảnh báo. Hãy cẩn thận với những gì bạn đọc trên Internet. API IO không đồng bộ của Python đã phát triển nhanh chóng từ Python 3. 4 đến Python 3. 7. Một số mẫu cũ không còn được sử dụng và một số thứ ban đầu không được phép hiện được cho phép thông qua các phần giới thiệu mới

Trọng tâm của async IO là các coroutine. Một coroutine là một phiên bản chuyên biệt của hàm tạo Python. Hãy bắt đầu với một định nghĩa cơ bản và sau đó xây dựng nó khi bạn tiến bộ ở đây. một coroutine là một chức năng có thể tạm dừng thực thi của nó trước khi đạt đến

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
57 và nó có thể gián tiếp chuyển quyền kiểm soát cho một coroutine khác trong một thời gian

Sau đó, bạn sẽ tìm hiểu sâu hơn về cách chính xác trình tạo truyền thống được tái sử dụng thành coroutine. Hiện tại, cách dễ nhất để hiểu cách thức hoạt động của các coroutine là bắt đầu tạo một số

Hãy thực hiện cách tiếp cận nhập vai và viết một số mã IO không đồng bộ. Chương trình ngắn này là

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
58 của async IO nhưng còn một chặng đường dài hướng tới việc minh họa chức năng cốt lõi của nó

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
7

Khi bạn thực thi tệp này, hãy lưu ý xem có gì khác so với khi bạn định nghĩa các hàm chỉ với

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
59 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
90

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
0

Thứ tự của đầu ra này là trung tâm của IO không đồng bộ. Nói chuyện với từng cuộc gọi tới

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
91 là một vòng lặp sự kiện hoặc điều phối viên. Khi mỗi tác vụ đạt đến
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
92, chức năng sẽ báo lên vòng lặp sự kiện và trả lại quyền kiểm soát cho nó, nói rằng, “Tôi sẽ ngủ trong 1 giây. Hãy tiếp tục và để điều gì đó có ý nghĩa khác được thực hiện trong thời gian chờ đợi. ”

Tương phản điều này với phiên bản đồng bộ

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]

Khi thực hiện, có một thay đổi nhỏ nhưng quan trọng về thứ tự và thời gian thực hiện

________số 8

Mặc dù việc sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
90 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
94 có vẻ tầm thường, nhưng chúng được sử dụng làm phương án thay thế cho bất kỳ quy trình tốn nhiều thời gian nào liên quan đến thời gian chờ đợi. [Điều trần tục nhất mà bạn có thể chờ đợi là một cuộc gọi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
95 về cơ bản không có gì. ] Nghĩa là,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
90 có thể đại diện cho bất kỳ lệnh gọi hàm chặn nào tốn thời gian, trong khi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
94 được sử dụng để thay thế cho lệnh gọi không chặn [nhưng lệnh gọi này cũng mất một khoảng thời gian để hoàn thành]

Như bạn sẽ thấy trong phần tiếp theo, lợi ích của việc chờ đợi một thứ gì đó, bao gồm cả

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
94, là hàm xung quanh có thể tạm thời nhường quyền kiểm soát cho một hàm khác dễ dàng thực hiện điều gì đó ngay lập tức. Ngược lại,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
90 hoặc bất kỳ cuộc gọi chặn nào khác không tương thích với mã Python không đồng bộ, bởi vì nó sẽ dừng mọi thứ theo dõi trong khoảng thời gian của thời gian ngủ

Loại bỏ các quảng cáo

Quy tắc của IO không đồng bộ

Tại thời điểm này, một định nghĩa chính thức hơn về

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 và các hàm coroutine mà chúng tạo ra theo thứ tự. Phần này hơi dày đặc, nhưng nắm bắt được
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 là công cụ, vì vậy hãy quay lại phần này nếu bạn cần

  • Cú pháp

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    64 giới thiệu một coroutine gốc hoặc một trình tạo không đồng bộ. Các biểu thức
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    65 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    66 cũng hợp lệ và bạn sẽ thấy chúng sau này

  • Từ khóa

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 chuyển điều khiển chức năng trở lại vòng lặp sự kiện. [Nó tạm dừng việc thực thi coroutine xung quanh. ] Nếu Python gặp một biểu thức
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    68 trong phạm vi của
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    69, thì đây là cách
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 báo cho vòng lặp sự kiện, “Tạm dừng thực thi của
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    69 cho đến khi bất cứ điều gì tôi đang chờ đợi—kết quả của
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    42—được trả về. Trong khi chờ đợi, hãy để thứ khác chạy. ”

Trong mã, gạch đầu dòng thứ hai trông giống như thế này

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5

Ngoài ra còn có một bộ quy tắc nghiêm ngặt về thời điểm và cách thức bạn có thể và không thể sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4. Những điều này có thể hữu ích cho dù bạn vẫn đang học cú pháp hay đã tiếp xúc với việc sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4

  • Một chức năng mà bạn giới thiệu với

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    64 là một coroutine. Nó có thể sử dụng
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4,
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    57 hoặc
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    30, nhưng tất cả đều là tùy chọn. Khai báo
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    31 là hợp lệ

    • Sử dụng

      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      4 và/hoặc
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      57 để tạo một hàm coroutine. Để gọi một chức năng coroutine, bạn phải
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      4 nó để có được kết quả của nó

    • Việc sử dụng

      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      30 trong khối
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      64 ít phổ biến hơn [và chỉ hợp pháp gần đây trong Python]. Điều này tạo ra một trình tạo không đồng bộ mà bạn lặp lại với
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      66. Tạm thời quên đi các trình tạo async và tập trung vào việc tìm hiểu cú pháp cho các hàm coroutine, sử dụng
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      4 và/hoặc
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      57

    • Bất kỳ thứ gì được xác định bằng

      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      64 đều không được sử dụng
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      701, điều này sẽ làm tăng
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      702

  • Giống như việc sử dụng

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    702 bên ngoài chức năng
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    59 của
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    702, thì đó là một
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    702 để sử dụng
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 bên ngoài quy trình đăng ký
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    64. Bạn chỉ có thể sử dụng
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 trong phần thân của coroutines

Dưới đây là một số ví dụ ngắn gọn nhằm tóm tắt một số quy tắc trên

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
9

Cuối cùng, khi bạn sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
68, điều bắt buộc là
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
42 phải là một đối tượng. Chà, điều đó không hữu ích lắm phải không? . Nếu bạn đang viết một chương trình, cho phần lớn các mục đích, bạn chỉ cần lo lắng về trường hợp #1

Điều đó đưa chúng ta đến một điểm khác biệt kỹ thuật nữa mà bạn có thể thấy cửa sổ bật lên. một cách cũ hơn để đánh dấu một hàm dưới dạng coroutine là trang trí một hàm

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
59 bình thường bằng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
714. Kết quả là một coroutine dựa trên trình tạo. Cấu trúc này đã lỗi thời kể từ khi cú pháp
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 được đưa vào Python 3. 5

Hai coroutine này về cơ bản là tương đương nhau [cả hai đều có thể chờ được], nhưng cái thứ nhất dựa trên trình tạo, trong khi cái thứ hai là một coroutine gốc

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
6

Nếu bạn đang tự viết bất kỳ mã nào, hãy ưu tiên các coroutine gốc vì mục đích rõ ràng hơn là ẩn. Các coroutine dựa trên trình tạo sẽ có trong Python 3. 10

Ở nửa sau của hướng dẫn này, chúng ta sẽ chỉ đề cập đến các coroutine dựa trên trình tạo để giải thích. Lý do mà

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 được giới thiệu là để làm cho các coroutine trở thành một tính năng độc lập của Python có thể dễ dàng phân biệt với một hàm tạo thông thường, do đó làm giảm sự mơ hồ

Đừng sa lầy vào các chương trình coroutine dựa trên máy phát điện, vốn đã có từ ngày

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4. Chúng có một bộ quy tắc nhỏ của riêng chúng [ví dụ: ____ ______04 không thể được sử dụng trong quy trình đăng ký dựa trên trình tạo] mà phần lớn không liên quan nếu bạn tuân theo cú pháp ____03/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4

Không có gì khó chịu, chúng ta hãy lấy thêm một vài ví dụ liên quan

Đây là một ví dụ về cách IO không đồng bộ cắt giảm thời gian chờ đợi. cho một coroutine

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
724 liên tục tạo ra các số nguyên ngẫu nhiên trong khoảng [0, 10], cho đến khi một trong số chúng vượt quá ngưỡng, bạn muốn để nhiều lệnh gọi của coroutine này không cần phải đợi nhau hoàn thành liên tiếp. Bạn có thể làm theo phần lớn các mẫu từ hai tập lệnh trên, với những thay đổi nhỏ

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4

Đầu ra được tô màu nói lên nhiều điều hơn tôi có thể và cho bạn biết cách thực hiện tập lệnh này

rand. thực thi py

Chương trình này sử dụng một coroutine chính,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
724 và chạy nó đồng thời trên 3 đầu vào khác nhau. Hầu hết các chương trình sẽ chứa các coroutine nhỏ, theo mô-đun và một chức năng bao bọc phục vụ để xâu chuỗi từng coroutine nhỏ hơn lại với nhau.
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 sau đó được sử dụng để thu thập các tác vụ [tương lai] bằng cách ánh xạ coroutine trung tâm qua một số iterable hoặc pool

Trong ví dụ thu nhỏ này, hồ bơi là

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
727. Trong một ví dụ đầy đủ hơn được trình bày sau, đó là một tập hợp các URL cần được yêu cầu, phân tích cú pháp và xử lý đồng thời và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 gói gọn toàn bộ quy trình đó cho mỗi URL

Mặc dù "tạo số nguyên ngẫu nhiên" [được giới hạn bởi CPU hơn bất kỳ thứ gì] có thể không phải là lựa chọn tốt nhất với tư cách là ứng cử viên cho

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5, nhưng sự hiện diện của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
94 trong ví dụ được thiết kế để bắt chước quy trình giới hạn IO khi không chắc chắn . Ví dụ: cuộc gọi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
94 có thể đại diện cho việc gửi và nhận các số nguyên không quá ngẫu nhiên giữa hai máy khách trong một ứng dụng tin nhắn

Loại bỏ các quảng cáo

Các mẫu thiết kế IO không đồng bộ

Async IO đi kèm với bộ thiết kế tập lệnh có thể có của riêng nó mà bạn sẽ được giới thiệu trong phần này

Xâu chuỗi Coroutines

Một tính năng chính của coroutines là chúng có thể được xâu chuỗi lại với nhau. [Hãy nhớ rằng, một đối tượng coroutine có thể chờ được, vì vậy một coroutine khác có thể

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 nó. ] Điều này cho phép bạn chia chương trình thành các chương trình nhỏ hơn, có thể quản lý và có thể tái chế

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3

Hãy chú ý cẩn thận đến đầu ra, trong đó

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
733 ngủ trong một khoảng thời gian thay đổi và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
734 bắt đầu làm việc với kết quả khi chúng có sẵn

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
70

Trong thiết lập này, thời gian chạy của

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 sẽ bằng với thời gian chạy tối đa của các tác vụ mà nó tập hợp lại và lên lịch

Sử dụng hàng đợi

Gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 cung cấp các lớp hàng đợi được thiết kế tương tự như các lớp của module. Trong các ví dụ của chúng tôi cho đến nay, chúng tôi chưa thực sự cần cấu trúc hàng đợi. Trong
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
738, mỗi tác vụ [tương lai] bao gồm một tập hợp các coroutine đang chờ đợi nhau một cách rõ ràng và chuyển qua một đầu vào duy nhất trên mỗi chuỗi

Có một cấu trúc thay thế cũng có thể hoạt động với IO không đồng bộ. một số nhà sản xuất không liên kết với nhau, thêm các mục vào hàng đợi. Mỗi nhà sản xuất có thể thêm nhiều mặt hàng vào hàng đợi theo thời gian so le, ngẫu nhiên, không báo trước. Một nhóm người tiêu dùng lấy đồ từ hàng đợi khi chúng xuất hiện, tham lam và không đợi bất kỳ tín hiệu nào khác

Trong thiết kế này, không có sự ràng buộc của bất kỳ người tiêu dùng cá nhân nào với nhà sản xuất. Người tiêu dùng không biết trước số lượng nhà sản xuất hoặc thậm chí số lượng mặt hàng tích lũy sẽ được thêm vào hàng đợi

Nhà sản xuất hoặc người tiêu dùng riêng lẻ phải mất một lượng thời gian khác nhau để đặt và trích xuất các mặt hàng từ hàng đợi, tương ứng. Hàng đợi đóng vai trò là thông lượng có thể giao tiếp với nhà sản xuất và người tiêu dùng mà không cần họ nói chuyện trực tiếp với nhau

Ghi chú. Mặc dù hàng đợi thường được sử dụng trong các chương trình theo luồng vì tính an toàn của luồng là

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
739, nhưng bạn không cần phải lo lắng về sự an toàn của luồng khi nói đến IO không đồng bộ. [Ngoại lệ là khi bạn kết hợp cả hai, nhưng điều đó không được thực hiện trong hướng dẫn này. ]

Một trường hợp sử dụng cho hàng đợi [như trường hợp ở đây] là để hàng đợi hoạt động như một bộ truyền cho nhà sản xuất và người tiêu dùng không được liên kết trực tiếp hoặc liên kết với nhau

Phiên bản đồng bộ của chương trình này trông khá ảm đạm. một nhóm các nhà sản xuất chặn thêm các mục vào hàng đợi, mỗi lần một nhà sản xuất. Chỉ sau khi tất cả các nhà sản xuất hoàn thành, hàng đợi mới có thể được xử lý, bởi một người tiêu dùng tại một thời điểm xử lý từng mặt hàng. Có rất nhiều độ trễ trong thiết kế này. Các mặt hàng có thể ngồi yên trong hàng đợi thay vì được lấy và xử lý ngay lập tức

Phiên bản không đồng bộ,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
740, bên dưới. Phần thách thức của quy trình công việc này là cần phải có tín hiệu cho người tiêu dùng biết rằng quá trình sản xuất đã hoàn tất. Nếu không,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
741 sẽ bị treo vô thời hạn, vì hàng đợi đã được xử lý đầy đủ, nhưng người tiêu dùng sẽ không biết rằng quá trình sản xuất đã hoàn tất

[Xin chân thành cảm ơn sự trợ giúp từ người dùng StackOverflow đã giúp giải quyết vấn đề

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726. chìa khóa là
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
743, chặn cho đến khi tất cả các mục trong hàng đợi được nhận và xử lý, sau đó hủy các tác vụ của người tiêu dùng, nếu không sẽ bị treo và chờ đợi vô tận cho các mục hàng đợi bổ sung xuất hiện. ]

Đây là kịch bản đầy đủ

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
71

Một số coroutine đầu tiên là các hàm trợ giúp trả về một chuỗi ngẫu nhiên, bộ đếm hiệu suất theo giây và một số nguyên ngẫu nhiên. Nhà sản xuất đặt từ 1 đến 5 mục vào hàng đợi. Mỗi mục là một bộ của

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
744 trong đó
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
745 là một chuỗi ngẫu nhiên và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
746 là thời điểm mà nhà sản xuất cố gắng đưa bộ vào hàng đợi

Khi người tiêu dùng lấy một mặt hàng ra, họ chỉ cần tính toán thời gian đã trôi qua mà mặt hàng đó nằm trong hàng đợi bằng cách sử dụng dấu thời gian mà mặt hàng đó được đưa vào.

Hãy nhớ rằng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
94 được sử dụng để bắt chước một số coroutine khác, phức tạp hơn sẽ ngốn thời gian và chặn tất cả các thực thi khác nếu đó là chức năng chặn thông thường

Đây là lần chạy thử với hai nhà sản xuất và năm người tiêu dùng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
72

Trong trường hợp này, các mục xử lý trong một phần giây. Một sự chậm trễ có thể là do hai lý do

  • Tiêu chuẩn, phần lớn không thể tránh khỏi chi phí
  • Các tình huống mà tất cả người tiêu dùng đang ngủ khi một mặt hàng xuất hiện trong hàng đợi

Liên quan đến lý do thứ hai, may mắn thay, việc mở rộng quy mô cho hàng trăm hoặc hàng nghìn người tiêu dùng là điều hoàn toàn bình thường. Bạn sẽ không gặp vấn đề gì với

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
748. Vấn đề ở đây là, về mặt lý thuyết, bạn có thể có những người dùng khác nhau trên các hệ thống khác nhau kiểm soát việc quản lý nhà sản xuất và người tiêu dùng, với hàng đợi đóng vai trò là thông lượng trung tâm

Cho đến nay, bạn đã bị ném ngay vào lửa và nhìn thấy ba ví dụ liên quan về việc gọi các coroutine của

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 được định nghĩa bằng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4. Nếu bạn không hoàn toàn theo dõi hoặc chỉ muốn tìm hiểu sâu hơn về cơ chế về cách các coroutine hiện đại ra đời trong Python, bạn sẽ bắt đầu từ ô vuông với phần tiếp theo

Loại bỏ các quảng cáo

Rễ của Async IO trong Trình tạo

Trước đó, bạn đã thấy một ví dụ về các coroutine dựa trên trình tạo kiểu cũ, đã bị lỗi thời bởi các coroutine bản địa rõ ràng hơn. Ví dụ đáng để hiển thị lại với một điều chỉnh nhỏ

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
73

Như một thử nghiệm, điều gì sẽ xảy ra nếu bạn gọi riêng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
752 hoặc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
753 mà không có
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 hoặc không có bất kỳ lệnh gọi nào đến
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755 hoặc các hàm "sứ" khác của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5?

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
74

Điều này không thú vị lắm trên bề mặt của nó. Kết quả của việc tự gọi một coroutine là một đối tượng coroutine có thể chờ đợi

Thời gian cho một bài kiểm tra. tính năng nào khác của Python trông như thế này?

Hy vọng rằng bạn đang nghĩ về máy phát điện như một câu trả lời cho câu hỏi này, bởi vì coroutine là máy phát điện nâng cao dưới mui xe. Hành vi tương tự trong vấn đề này

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
75

Các chức năng của trình tạo, như đã xảy ra, là nền tảng của IO không đồng bộ [bất kể bạn có khai báo các coroutine bằng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
64 thay vì trình bao bọc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
714 cũ hơn hay không]. Về mặt kỹ thuật,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 gần giống với _______ 2701 hơn là với ________ 630. [Nhưng hãy nhớ rằng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
762 chỉ là đường cú pháp để thay thế cho
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
763. ]

Một tính năng quan trọng của các trình tạo liên quan đến IO không đồng bộ là chúng có thể được dừng và khởi động lại một cách hiệu quả theo ý muốn. Ví dụ: bạn có thể

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
764 thoát khỏi việc lặp lại một đối tượng trình tạo và sau đó tiếp tục lặp lại trên các giá trị còn lại sau. Khi một hàm tạo đạt đến
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30, nó sẽ mang lại giá trị đó, nhưng sau đó, nó sẽ không hoạt động cho đến khi nó được yêu cầu mang lại giá trị tiếp theo

Điều này có thể được xác minh thông qua một ví dụ

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
76

Từ khóa

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 hoạt động tương tự, đánh dấu một điểm ngắt mà tại đó quy trình đăng ký tự đình chỉ và cho phép các quy trình đăng ký khác hoạt động. “Suspended,” trong trường hợp này, có nghĩa là một coroutine đã tạm thời nhường quyền kiểm soát nhưng chưa hoàn toàn thoát hoặc hoàn thành. Hãy nhớ rằng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30, và bằng cách mở rộng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
701 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4, đánh dấu điểm dừng trong quá trình thực thi của trình tạo

Đây là sự khác biệt cơ bản giữa chức năng và trình tạo. Một chức năng là tất cả hoặc không có gì. Sau khi nó bắt đầu, nó sẽ không dừng cho đến khi nó chạm vào

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
57, sau đó đẩy giá trị đó cho người gọi [hàm gọi nó]. Mặt khác, một máy phát điện sẽ tạm dừng mỗi khi nó chạm tới
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30 và không đi xa hơn. Nó không chỉ có thể đẩy giá trị này vào ngăn xếp đang gọi mà còn có thể giữ các biến cục bộ của nó khi bạn tiếp tục lại bằng cách gọi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
772 trên đó

Có một tính năng thứ hai và ít được biết đến của máy phát điện cũng quan trọng. Bạn cũng có thể gửi một giá trị vào trình tạo thông qua phương thức

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
773 của nó. Điều này cho phép các trình tạo [và coroutines] gọi [
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4] lẫn nhau mà không bị chặn. Tôi sẽ không tìm hiểu sâu hơn về các chi tiết cơ bản của tính năng này, bởi vì nó chủ yếu quan trọng đối với việc triển khai các coroutine phía sau hậu trường, nhưng bạn không bao giờ thực sự cần phải trực tiếp sử dụng tính năng này

Nếu bạn muốn khám phá thêm, bạn có thể bắt đầu tại PEP 342, nơi các coroutine chính thức được giới thiệu. Brett Cannon's How the Heck Does Async-Await Work in Python cũng là một bài đọc hay, cũng như bài viết PYMOTW trên

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5. Cuối cùng, có Khóa học tò mò của David Beazley về Coroutines và Đồng thời, đi sâu vào cơ chế mà các coroutine chạy

Hãy cố gắng cô đọng tất cả các bài viết trên trong một vài câu. có một cơ chế đặc biệt độc đáo mà các coroutine này thực sự được chạy. Kết quả của họ là một thuộc tính của đối tượng ngoại lệ bị ném ra khi phương thức

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
773 của họ được gọi. Có một số chi tiết thú vị hơn cho tất cả những điều này, nhưng nó có thể sẽ không giúp bạn sử dụng phần ngôn ngữ này trong thực tế, vì vậy hãy tiếp tục ngay bây giờ

Để liên kết mọi thứ lại với nhau, đây là một số điểm chính về chủ đề coroutines là máy phát điện

  • Các coroutines tận dụng các đặc thù của các phương thức tạo

  • Các coroutine dựa trên trình tạo cũ sử dụng

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    701 để chờ kết quả của coroutine. Cú pháp Python hiện đại trong các coroutine bản địa chỉ đơn giản là thay thế
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    701 bằng
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 như một phương tiện để chờ kết quả của coroutine.
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 tương tự như
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    701, và nó thường hữu ích khi nghĩ về nó như vậy

  • Việc sử dụng

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 là tín hiệu đánh dấu điểm dừng. Nó cho phép một coroutine tạm thời đình chỉ thực thi và cho phép chương trình quay lại với nó sau

Loại bỏ các quảng cáo

Các tính năng khác.
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
66 và Trình tạo Async + Khả năng hiểu

Cùng với

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 đơn giản, Python cũng cho phép
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
66 lặp qua một trình lặp không đồng bộ. Mục đích của trình lặp không đồng bộ là để nó có thể gọi mã không đồng bộ ở mỗi giai đoạn khi nó được lặp lại

Một phần mở rộng tự nhiên của khái niệm này là một máy phát điện không đồng bộ. Nhớ lại rằng bạn có thể sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
57 hoặc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30 trong quy trình đăng ký bản địa. Có thể sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30 trong coroutine trong Python 3. 6 [thông qua PEP 525], đã giới thiệu các trình tạo không đồng bộ với mục đích cho phép sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30 trong cùng một thân hàm coroutine

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
77

Cuối cùng nhưng không kém phần quan trọng, Python cho phép hiểu không đồng bộ với

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
66. Giống như người anh em họ đồng bộ của nó, đây phần lớn là đường cú pháp

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
78

Đây là một sự khác biệt quan trọng. cả trình tạo không đồng bộ cũng như khả năng hiểu đều không làm cho phép lặp đồng thời. Tất cả những gì họ làm là cung cấp giao diện của các đối tác đồng bộ của họ, nhưng với khả năng vòng lặp được đề cập từ bỏ quyền kiểm soát vòng lặp sự kiện để một số chương trình điều tra khác chạy

Nói cách khác, trình lặp không đồng bộ và trình tạo không đồng bộ không được thiết kế để ánh xạ đồng thời một số chức năng trên một trình tự hoặc trình lặp. Chúng chỉ được thiết kế để cho phép coroutine kèm theo cho phép các nhiệm vụ khác thay phiên nhau thực hiện. Các câu lệnh

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
66 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
65 chỉ cần thiết trong phạm vi mà việc sử dụng
$ python3 countsync.py
One
Two
One
Two
One
Two
countsync.py executed in 3.01 seconds.
0 hoặc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
797 đơn giản sẽ “phá vỡ” bản chất của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 trong coroutine. Sự khác biệt giữa tính không đồng bộ và đồng thời là một điều quan trọng cần nắm bắt

Vòng lặp sự kiện và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755

Bạn có thể coi một vòng lặp sự kiện giống như một vòng lặp

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
000 giám sát các coroutine, nhận phản hồi về những gì không hoạt động và tìm kiếm những thứ có thể được thực thi trong thời gian chờ đợi. Nó có thể đánh thức một coroutine đang nhàn rỗi khi bất cứ thứ gì mà coroutine đó đang chờ trở nên khả dụng

Cho đến nay, toàn bộ việc quản lý vòng lặp sự kiện đã được xử lý hoàn toàn bằng một lệnh gọi hàm

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
79

, được giới thiệu trong Python 3. 7, chịu trách nhiệm nhận vòng lặp sự kiện, chạy các tác vụ cho đến khi chúng được đánh dấu là hoàn thành, sau đó đóng vòng lặp sự kiện

Có một cách dài dòng hơn để quản lý vòng lặp sự kiện

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5, với
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
003. Mô hình điển hình trông như thế này

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
00

Có thể bạn sẽ thấy

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
004 nổi xung quanh trong các ví dụ cũ hơn, nhưng trừ khi bạn có nhu cầu cụ thể để tinh chỉnh quyền kiểm soát đối với việc quản lý vòng lặp sự kiện, thì
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755 là đủ cho hầu hết các chương trình

Nếu bạn cần tương tác với vòng lặp sự kiện trong chương trình Python, thì

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
006 là một đối tượng Python cổ điển hỗ trợ xem xét nội tâm với
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
007 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
008. Bạn có thể thao tác nó nếu bạn cần kiểm soát tinh chỉnh hơn, chẳng hạn như bằng cách chuyển vòng lặp làm đối số

Điều quan trọng hơn là hiểu một chút bên dưới bề mặt về cơ chế của vòng lặp sự kiện. Dưới đây là một vài điểm đáng nhấn mạnh về vòng lặp sự kiện

#1. Các coroutine không tự làm được gì nhiều cho đến khi chúng được gắn với vòng lặp sự kiện

Bạn đã thấy điểm này trước đây trong phần giải thích về máy phát điện, nhưng nó đáng để trình bày lại. Nếu bạn có một coroutine chính đang đợi những người khác, chỉ cần gọi nó một cách cô lập sẽ có rất ít tác dụng

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
01

Hãy nhớ sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755 để thực sự buộc thực thi bằng cách lên lịch cho quy trình đăng ký
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 [đối tượng trong tương lai] để thực thi trên vòng lặp sự kiện

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
02

[Các coroutine khác có thể được thực thi với

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4. Thông thường, chỉ bọc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 trong
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755 và các coroutine bị xiềng xích với
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 sẽ được gọi từ đó. ]

#2. Theo mặc định, vòng lặp sự kiện IO không đồng bộ chạy trong một luồng và trên một lõi CPU. Thông thường, chạy một vòng lặp sự kiện đơn luồng trong một lõi CPU là quá đủ. Cũng có thể chạy các vòng lặp sự kiện trên nhiều lõi. Hãy xem bài nói chuyện này của John Reese để biết thêm và được cảnh báo rằng máy tính xách tay của bạn có thể tự bốc cháy

#3. Các vòng lặp sự kiện có thể cắm được. Nghĩa là, nếu bạn thực sự muốn, bạn có thể viết triển khai vòng lặp sự kiện của riêng mình và để nó chạy các tác vụ giống như vậy. Điều này được thể hiện một cách tuyệt vời trong gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
015, đây là một triển khai của vòng lặp sự kiện trong Cython

Đó là ý nghĩa của thuật ngữ “vòng lặp sự kiện có thể cắm”. bạn có thể sử dụng bất kỳ triển khai hoạt động nào của vòng lặp sự kiện, không liên quan đến cấu trúc của chính các coroutine. Bản thân gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 đi kèm với , với mặc định dựa trên mô-đun. [Triển khai thứ hai chỉ được xây dựng cho Windows. ]

Loại bỏ các quảng cáo

Một chương trình đầy đủ. Yêu cầu không đồng bộ

Bạn đã tiến xa đến mức này, và bây giờ là lúc dành cho phần thú vị và không đau đớn. Trong phần này, bạn sẽ xây dựng trình thu thập URL quét web,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
018, sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
8, khung máy khách/máy chủ HTTP không đồng bộ cực nhanh. [Chúng tôi chỉ cần phần khách hàng. ] Một công cụ như vậy có thể được sử dụng để lập bản đồ các kết nối giữa một nhóm các trang web, với các liên kết tạo thành biểu đồ có hướng

Ghi chú. Bạn có thể thắc mắc tại sao gói

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
020 của Python không tương thích với IO không đồng bộ.
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
020 được xây dựng dựa trên _______ 3022, lần lượt sử dụng các mô-đun ________ 3023 và ________ 3024 của Python

Theo mặc định, các hoạt động của ổ cắm đang chặn. Điều này có nghĩa là Python sẽ không thích

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
025 vì
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
026 không thể chờ đợi. Ngược lại, hầu hết mọi thứ trong
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
8 đều là một quy trình có thể chờ đợi, chẳng hạn như và. Mặt khác, đó là một gói tuyệt vời, nhưng bạn đang tự làm hại mình bằng cách sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
020 trong mã không đồng bộ

Cấu trúc chương trình cấp cao sẽ như thế này

  1. Đọc chuỗi URL từ tệp cục bộ,

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    031

  2. Gửi yêu cầu GET cho các URL và giải mã nội dung kết quả. Nếu điều này không thành công, hãy dừng lại ở đó để lấy URL

  3. Tìm kiếm các URL trong thẻ

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    032 trong HTML của các câu trả lời

  4. Viết kết quả vào

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    033

  5. Thực hiện tất cả các thao tác trên một cách không đồng bộ và đồng thời nhất có thể. [Sử dụng

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    8 cho các yêu cầu và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    9 cho tệp-appends. Đây là hai ví dụ chính về IO rất phù hợp với mô hình IO không đồng bộ. ]

Đây là nội dung của

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
031. Nó không lớn và chứa hầu hết các trang web được buôn bán nhiều

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
03

URL thứ hai trong danh sách sẽ trả về phản hồi 404 mà bạn sẽ cần xử lý khéo léo. Nếu bạn đang chạy phiên bản mở rộng của chương trình này, có lẽ bạn sẽ cần xử lý nhiều vấn đề khó khăn hơn thế này, chẳng hạn như ngắt kết nối máy chủ và chuyển hướng vô tận

Bản thân các yêu cầu phải được thực hiện bằng một phiên duy nhất để tận dụng việc sử dụng lại nhóm kết nối nội bộ của phiên

Hãy cùng xem toàn bộ chương trình. Chúng ta sẽ xem xét mọi thứ từng bước sau

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
04

Kịch bản này dài hơn các chương trình đồ chơi ban đầu của chúng tôi, vì vậy hãy chia nhỏ nó

Hằng số

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
037 là một biểu thức chính quy để trích xuất những gì cuối cùng chúng ta đang tìm kiếm, các thẻ
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
032 trong HTML

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
05

Quy trình đăng quang

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
039 là một trình bao bọc xung quanh yêu cầu GET để thực hiện yêu cầu và giải mã HTML của trang kết quả. Nó đưa ra yêu cầu, chờ phản hồi và tăng ngay lập tức trong trường hợp trạng thái không phải 200

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
06

Nếu trạng thái ổn,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
039 trả về trang HTML [a
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
041]. Đáng chú ý, không có xử lý ngoại lệ nào được thực hiện trong chức năng này. Logic là truyền ngoại lệ đó cho người gọi và để nó được xử lý ở đó

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
07

Chúng tôi

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
028 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
044 vì chúng là các coroutine đáng chờ đợi. Nếu không, chu kỳ yêu cầu/phản hồi sẽ là phần kéo dài, chiếm nhiều thời gian của ứng dụng, nhưng với IO không đồng bộ,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
039 cho phép vòng lặp sự kiện hoạt động trên các công việc có sẵn khác như phân tích cú pháp và viết URL đã được tìm nạp

Tiếp theo trong chuỗi coroutines là

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
046, chờ đợi trên
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
039 cho một URL nhất định, sau đó trích xuất tất cả các thẻ
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
032 từ HTML của trang đó, đảm bảo rằng mỗi thẻ đều hợp lệ và định dạng nó dưới dạng một đường dẫn tuyệt đối

Phải thừa nhận rằng phần thứ hai của

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
046 đang bị chặn, nhưng nó bao gồm một đối sánh biểu thức chính quy nhanh và đảm bảo rằng các liên kết được phát hiện được tạo thành các đường dẫn tuyệt đối

Trong trường hợp cụ thể này, mã đồng bộ này phải nhanh chóng và kín đáo. Nhưng chỉ cần nhớ rằng bất kỳ dòng nào trong một coroutine nhất định sẽ chặn các coroutine khác trừ khi dòng đó sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30,
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 hoặc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
57. Nếu quá trình phân tích cú pháp là một quá trình chuyên sâu hơn, bạn có thể muốn xem xét việc chạy phần này trong quá trình riêng của nó với

Tiếp theo, coroutine

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
054 lấy một đối tượng tệp và một URL duy nhất, đồng thời đợi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
046 trả về một
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
056 trong số các URL được phân tích cú pháp, ghi từng URL vào tệp một cách không đồng bộ cùng với URL nguồn của nó thông qua việc sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
9, một gói dành cho tệp không đồng bộ IO

Cuối cùng,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
058 đóng vai trò là điểm vào chính trong chuỗi coroutines của tập lệnh. Nó sử dụng một phiên duy nhất và một tác vụ được tạo cho mỗi URL cuối cùng được đọc từ
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
031

Dưới đây là một vài điểm bổ sung đáng được đề cập

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    060 mặc định có tối đa 100 kết nối mở. Để thay đổi điều đó, hãy chuyển phiên bản của
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    061 thành
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    060. Bạn cũng có thể chỉ định giới hạn trên cơ sở mỗi máy chủ lưu trữ

  • Bạn có thể chỉ định giá trị tối đa cho cả phiên nói chung và cho từng yêu cầu riêng lẻ

  • Tập lệnh này cũng sử dụng

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    65, hoạt động với một. Tôi chưa dành toàn bộ phần cho khái niệm này vì quá trình chuyển đổi từ trình quản lý bối cảnh đồng bộ sang không đồng bộ khá đơn giản. Cái sau phải xác định
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    064 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    065 thay vì
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    066 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    067. Như bạn có thể mong đợi,
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    65 chỉ có thể được sử dụng bên trong một chức năng coroutine được khai báo với
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    64

Nếu bạn muốn khám phá thêm một chút, các tệp đồng hành cho hướng dẫn này tại GitHub cũng có các nhận xét và chuỗi tài liệu được đính kèm

Đây là cách thực thi tuyệt vời nhất của nó, khi

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
018 nhận, phân tích cú pháp và lưu kết quả cho 9 URL trong chưa đầy một giây

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
08

Điều đó không quá tồi tàn. Để kiểm tra độ chính xác, bạn có thể kiểm tra số dòng trên đầu ra. Trong trường hợp của tôi, đó là 626, mặc dù hãy nhớ rằng điều này có thể dao động

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
09

Bước tiếp theo. Nếu bạn muốn nâng cao kiến ​​thức, hãy làm cho trình thu thập thông tin web này trở nên đệ quy. Bạn có thể sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
071 để theo dõi những URL nào đã được thu thập thông tin trong cây để tránh yêu cầu chúng hai lần và kết nối các liên kết với thư viện
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
072 của Python

Nhớ phải tử tế. Gửi 1000 yêu cầu đồng thời đến một trang web nhỏ, không nghi ngờ là điều tồi tệ, tồi tệ. Có nhiều cách để hạn chế số lượng yêu cầu đồng thời mà bạn thực hiện trong một đợt, chẳng hạn như sử dụng các đối tượng semaphore của ________ 05 hoặc sử dụng một mẫu như mẫu này. Nếu bạn không chú ý đến cảnh báo này, bạn có thể nhận được một loạt lớn các ngoại lệ

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
074 và cuối cùng chỉ gây hại cho chương trình của chính bạn

Loại bỏ các quảng cáo

IO không đồng bộ trong ngữ cảnh

Bây giờ bạn đã thấy một lượng mã tốt, hãy lùi lại một phút và xem xét khi nào IO không đồng bộ là một lựa chọn lý tưởng và cách bạn có thể thực hiện so sánh để đi đến kết luận đó hoặc chọn một mô hình đồng thời khác

Khi nào và tại sao Async IO là sự lựa chọn đúng đắn?

Hướng dẫn này không dành cho một chuyên luận mở rộng về asyncIO so với luồng so với đa xử lý. Tuy nhiên, thật hữu ích khi biết khi nào IO không đồng bộ có lẽ là ứng cử viên sáng giá nhất trong ba

Cuộc chiến giữa IO không đồng bộ và đa xử lý hoàn toàn không phải là cuộc chiến. Trên thực tế, chúng có thể được sử dụng trong buổi hòa nhạc. Nếu bạn có nhiều tác vụ liên quan đến CPU khá thống nhất [một ví dụ tuyệt vời là một trong các thư viện như

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
075 hoặc
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
076], đa xử lý sẽ là một lựa chọn hiển nhiên

Chỉ cần đặt

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3 trước mọi chức năng là một ý tưởng tồi nếu tất cả các chức năng đều sử dụng lệnh chặn. [Điều này thực sự có thể làm chậm mã của bạn. ] Nhưng như đã đề cập trước đây, có những nơi mà IO không đồng bộ và đa xử lý có thể chung sống hài hòa

Cuộc thi giữa asyncIO và luồng trực tiếp hơn một chút. Tôi đã đề cập trong phần giới thiệu rằng “phân luồng khó. ” Toàn bộ câu chuyện là, ngay cả trong trường hợp việc phân luồng có vẻ dễ thực hiện, nó vẫn có thể dẫn đến các lỗi khét tiếng không thể theo dõi do điều kiện cuộc đua và mức sử dụng bộ nhớ, trong số những thứ khác

Luồng cũng có xu hướng mở rộng quy mô kém thanh lịch hơn IO không đồng bộ, vì luồng là tài nguyên hệ thống có sẵn hữu hạn. Việc tạo hàng nghìn luồng sẽ không thành công trên nhiều máy và tôi khuyên bạn không nên thử ngay từ đầu. Tạo hàng ngàn tác vụ IO không đồng bộ là hoàn toàn khả thi

IO không đồng bộ tỏa sáng khi bạn có nhiều tác vụ giới hạn IO, trong đó các tác vụ sẽ bị chi phối bằng cách chặn thời gian chờ giới hạn IO, chẳng hạn như

  • Mạng IO, cho dù chương trình của bạn là phía máy chủ hay phía máy khách

  • Các thiết kế không có máy chủ, chẳng hạn như mạng ngang hàng, nhiều người dùng như phòng trò chuyện nhóm

  • Các thao tác đọc/ghi mà bạn muốn bắt chước phong cách “cháy và quên” nhưng bớt lo lắng về việc giữ khóa bất cứ thứ gì bạn đang đọc và ghi vào

Lý do lớn nhất để không sử dụng nó là

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 chỉ hỗ trợ một nhóm đối tượng xác định một nhóm phương thức cụ thể. Nếu bạn muốn thực hiện các thao tác đọc không đồng bộ với một DBMS nhất định, bạn không chỉ cần tìm một trình bao bọc Python cho DBMS đó, mà còn phải tìm một trình bao bọc hỗ trợ cú pháp
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4. Các coroutine chứa các cuộc gọi đồng bộ sẽ chặn các coroutine và tác vụ khác đang chạy

Để biết danh sách rút gọn các thư viện hoạt động với

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4, hãy xem phần cuối của hướng dẫn này

IO không đồng bộ Đó là, nhưng cái nào?

Hướng dẫn này tập trung vào IO không đồng bộ, cú pháp

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 và sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 để quản lý vòng lặp sự kiện và chỉ định tác vụ.
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 chắc chắn không phải là thư viện IO không đồng bộ duy nhất hiện có. Quan sát này từ Nathaniel J. Smith nói rất nhiều

[Trong] một vài năm tới,

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 có thể thấy mình bị xuống hạng để trở thành một trong những thư viện stdlib mà các nhà phát triển hiểu biết tránh xa, như
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
088

Trên thực tế, điều tôi đang tranh luận là

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 là nạn nhân của sự thành công của chính nó. khi nó được thiết kế, nó đã sử dụng cách tiếp cận tốt nhất có thể; . [Nguồn]

Cuối cùng, một vài lựa chọn thay thế tên tuổi làm những gì mà

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 làm, mặc dù có các API khác nhau và các cách tiếp cận khác nhau, là
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
095 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
096. Cá nhân tôi nghĩ rằng nếu bạn đang xây dựng một chương trình đơn giản, có kích thước vừa phải, thì chỉ cần sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 là đủ và dễ hiểu, đồng thời cho phép bạn tránh thêm một phụ thuộc lớn khác bên ngoài thư viện chuẩn của Python

Nhưng bằng mọi giá, hãy xem

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
095 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
096, và bạn có thể thấy rằng họ hoàn thành công việc tương tự theo cách trực quan hơn đối với bạn với tư cách là người dùng. Nhiều khái niệm về gói bất khả tri được trình bày ở đây cũng sẽ thấm vào các gói IO không đồng bộ thay thế

Vụn vặt

Trong vài phần tiếp theo này, bạn sẽ đề cập đến một số phần linh tinh của

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 cho đến nay vẫn chưa phù hợp với hướng dẫn, nhưng vẫn rất quan trọng để xây dựng và hiểu một chương trình đầy đủ

Các chức năng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5 cấp cao nhất khác

Ngoài

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755, bạn đã thấy một số chức năng cấp gói khác như
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
05 và
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
06

Bạn có thể sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
07 để lên lịch thực hiện một đối tượng coroutine, tiếp theo là
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
0

Có một sự tinh tế cho mô hình này. nếu bạn không

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
09 trong vòng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726, nó có thể kết thúc trước khi chính
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 báo hiệu rằng nó đã hoàn thành. Bởi vì
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
12 , vòng lặp sự kiện chỉ quan tâm [không có mặt của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
09] rằng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 đã hoàn thành, chứ không phải các tác vụ được tạo trong
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
726 đã hoàn thành. Không có
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
09, các nhiệm vụ khác của vòng lặp, có thể trước khi chúng được hoàn thành. Nếu bạn cần lấy danh sách các nhiệm vụ hiện đang chờ xử lý, bạn có thể sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
18

Ghi chú.

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
05 đã được giới thiệu trong Python 3. 7. Trong Trăn 3. 6 hoặc thấp hơn, sử dụng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
20 thay cho
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
07

Riêng biệt, có

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
06. Mặc dù nó không làm bất cứ điều gì quá đặc biệt, nhưng
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
23 có nghĩa là sắp xếp gọn gàng một bộ sưu tập các coroutines [tương lai] vào một tương lai duy nhất. Kết quả là, nó trả về một đối tượng tương lai duy nhất và nếu bạn
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
24 và chỉ định nhiều tác vụ hoặc quy trình đăng ký, thì bạn đang đợi tất cả chúng hoàn thành. [Điều này hơi tương đồng với
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
25 từ ví dụ trước của chúng tôi. ] Kết quả của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
23 sẽ là một danh sách các kết quả trên các yếu tố đầu vào

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
1

Bạn có thể nhận thấy rằng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
23 chờ đợi trên toàn bộ tập hợp kết quả của Futures hoặc coroutines mà bạn vượt qua nó. Ngoài ra, bạn có thể lặp lại
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
28 để nhận nhiệm vụ khi chúng được hoàn thành, theo thứ tự hoàn thành. Hàm trả về một trình vòng lặp mang lại các tác vụ khi chúng hoàn thành. Dưới đây, kết quả của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
29 sẽ có trước khi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30 hoàn thành, điều này không xảy ra với
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
23

>>>

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
2

Cuối cùng, bạn cũng có thể thấy

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
20. Bạn hiếm khi cần đến nó, vì đây là API hệ thống ống nước cấp thấp hơn và được thay thế phần lớn bởi
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
07, được giới thiệu sau

Loại bỏ các quảng cáo

Quyền ưu tiên của
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4

Mặc dù chúng hoạt động hơi giống nhau, nhưng từ khóa

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 có mức độ ưu tiên cao hơn đáng kể so với từ khóa
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
30. Điều này có nghĩa là, bởi vì nó được ràng buộc chặt chẽ hơn, nên có một số trường hợp bạn cần có dấu ngoặc đơn trong câu lệnh
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
701 mà không cần thiết trong câu lệnh
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 tương tự. Để biết thêm thông tin, xem từ PEP 492

Phần kết luận

Bây giờ bạn đã được trang bị để sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
3/
#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
4 và các thư viện được tạo ra từ nó. Đây là bản tóm tắt những gì bạn đã đề cập

  • IO không đồng bộ như một mô hình bất khả tri về ngôn ngữ và một cách để tạo hiệu ứng đồng thời bằng cách cho phép các coroutine giao tiếp gián tiếp với nhau

  • Các chi tiết cụ thể của các từ khóa

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 mới của Python, được sử dụng để đánh dấu và xác định các coroutine

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5, gói Python cung cấp API để chạy và quản lý các coroutine

Tài nguyên

Phiên bản Python cụ thể

Async IO trong Python đã phát triển nhanh chóng và khó có thể theo dõi điều gì xảy ra khi. Đây là danh sách các thay đổi và giới thiệu phiên bản nhỏ của Python liên quan đến

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
5

  • 3. 3. Biểu thức

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    701 cho phép ủy quyền trình tạo

  • 3. 4.

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5 đã được giới thiệu trong thư viện chuẩn Python với trạng thái API tạm thời

  • 3. 5.

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 đã trở thành một phần của ngữ pháp Python, được sử dụng để biểu thị và chờ đợi trên coroutine. Chúng chưa được đặt trước từ khóa. [Bạn vẫn có thể định nghĩa các hàm hoặc biến có tên là
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4. ]

  • 3. 6. Trình tạo không đồng bộ và hiểu không đồng bộ đã được giới thiệu. API của

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5 được tuyên bố là ổn định thay vì tạm thời

  • 3. 7.

    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3 và
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4 trở thành từ khóa dành riêng. [Chúng không thể được sử dụng làm định danh. ] Chúng được dùng để thay thế bộ trang trí
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    55.
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    755 đã được đưa vào gói
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5, trong số

Nếu bạn muốn an toàn [và có thể sử dụng

#!/usr/bin/env python3
# countsync.py

import time

def count[]:
    print["One"]
    time.sleep[1]
    print["Two"]

def main[]:
    for _ in range[3]:
        count[]

if __name__ == "__main__":
    s = time.perf_counter[]
    main[]
    elapsed = time.perf_counter[] - s
    print[f"{__file__} executed in {elapsed:0.2f} seconds."]
755], hãy sử dụng Python 3. 7 trở lên để có đầy đủ các tính năng

Bài viết

Đây là danh sách tuyển chọn các tài nguyên bổ sung

  • Trăn thật. Tăng tốc Chương trình Python của bạn với Đồng thời
  • Trăn thật. Khóa phiên dịch toàn cầu Python là gì?
  • CPython. Nguồn gói
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5
  • tài liệu Python.
  • TalkPython. Các kỹ thuật và ví dụ về Async trong Python
  • Brett pháo. Async-Await hoạt động như thế nào trong Python 3. 5?
  • PYMOTW.
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5
  • A. Jesse Jiryu Davis và Guido van Rossum. Trình thu thập dữ liệu web với asyncio Coroutines
  • Andy Pearce. Trạng thái của Python Coroutines.
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    701
  • Nathaniel J. thợ rèn. Một số Suy nghĩ về Thiết kế API Không đồng bộ trong Thế giới Hậu-
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3/
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4
  • Armin Ronacher. Tôi không hiểu Asyncio của Python
  • Andy Balaam. sê-ri trên
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5 [4 bài viết]
  • tràn ngăn xếp. Python
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    65 trong hàm
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    3-
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    4
  • Yeray Diaz
    • AsyncIO dành cho Nhà phát triển Python đang hoạt động
    • Các mẫu quy trình Asyncio. Ngoài
      #!/usr/bin/env python3
      # countsync.py
      
      import time
      
      def count[]:
          print["One"]
          time.sleep[1]
          print["Two"]
      
      def main[]:
          for _ in range[3]:
              count[]
      
      if __name__ == "__main__":
          s = time.perf_counter[]
          main[]
          elapsed = time.perf_counter[] - s
          print[f"{__file__} executed in {elapsed:0.2f} seconds."]
      
      4

Một vài phần Python Có gì mới giải thích động lực đằng sau những thay đổi ngôn ngữ chi tiết hơn

  • [
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    701 và PEP 380]
  • [PEP 525 và 530]

Từ David Beazley

  • Máy phát điện. Thủ thuật dành cho lập trình viên hệ thống
  • Một khóa học thú vị về Coroutines và Concurrency
  • máy phát điện. Biên giới cuối cùng

nói chuyện trên YouTube

  • John Reese - Suy nghĩ bên ngoài GIL với AsyncIO và Đa xử lý - PyCon 2018
  • Keynote David Beazley - Chủ đề quan tâm [Python Asyncio]
  • David Beazley - Đồng thời Python từ đầu. SỐNG. - PyCon 2015
  • Raymond Hettinger, Bài phát biểu quan trọng về đồng thời, PyBay 2017
  • Suy nghĩ về Đồng thời, Raymond Hettinger, nhà phát triển lõi Python
  • Miguel Grinberg Python không đồng bộ cho người mới bắt đầu hoàn thành PyCon 2017
  • Yury Selivanov asyncawait và asyncio trong Python 3 6 trở lên PyCon 2017
  • Sợ hãi và chờ đợi trong Async. Hành trình man rợ đến trái tim của giấc mơ Coroutine
  • Async là gì, nó hoạt động như thế nào và khi nào tôi nên sử dụng nó?

PEP liên quan

PEPDate CreatedPEP 342 – Coroutines thông qua Enhanced Generators2005-05PEP 380 – Cú pháp để ủy quyền cho Subgenerator2009-02PEP 3153 – Hỗ trợ IO không đồng bộ2011-05PEP 3156 – Khởi động lại hỗ trợ IO không đồng bộ. mô-đun “asyncio”2012-12PEP 492 – Coroutines với cú pháp async và đang chờ2015-04PEP 525 – Trình tạo không đồng bộ2016-07PEP 530 – Hiểu không đồng bộ2016-09

Loại bỏ các quảng cáo

Thư viện hoạt động với ____03/_______04

Từ aio-libs

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    8. Khung máy khách/máy chủ HTTP không đồng bộ
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    73. Hỗ trợ Async IO Redis
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    74. Hỗ trợ Async IO PostgreSQL
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    75. Máy khách memcached IO không đồng bộ
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    76. Ứng dụng khách Async IO Kafka
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    77. Hỗ trợ Async IO ZeroMQ
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    78. Lập lịch công việc để quản lý các tác vụ nền
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    79. Bộ đệm LRU đơn giản cho IO không đồng bộ

từ ma thuật

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    015. Vòng lặp sự kiện IO không đồng bộ cực nhanh
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    81. [Cũng rất nhanh] hỗ trợ async IO PostgreSQL

Từ các máy chủ khác

  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    096. Thân thiện hơn
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5 nhằm giới thiệu một thiết kế đơn giản hơn
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    9. Tệp IO không đồng bộ
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    85. Thư viện http giống như yêu cầu không đồng bộ
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    86. Hỗ trợ Async IO Redis
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    87. Tích hợp mô-đun
    $ python3 countsync.py
    One
    Two
    One
    Two
    One
    Two
    countsync.py executed in 3.01 seconds.
    
    1 với
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    90. Máy khách IO MongoDB không đồng bộ
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    91. Không đồng bộ hóa
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    5
  • #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    93. Giống như
    #!/usr/bin/env python3
    # countsync.py
    
    import time
    
    def count[]:
        print["One"]
        time.sleep[1]
        print["Two"]
    
    def main[]:
        for _ in range[3]:
            count[]
    
    if __name__ == "__main__":
        s = time.perf_counter[]
        main[]
        elapsed = time.perf_counter[] - s
        print[f"{__file__} executed in {elapsed:0.2f} seconds."]
    
    94, nhưng không đồng bộ

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Thực hành đồng thời Python 3 với Mô-đun asyncio

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Brad Solomon

Brad là một kỹ sư phần mềm và là thành viên của Nhóm hướng dẫn Python thực sự

» Thông tin thêm về Brad

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

David

Joanna

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng các chuyên gia Pythonistas

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Chủ Đề