Hướng dẫn coroutine python - trăn đăng quang

Chúng ta đều quen thuộc với khái niệm hàm, cái mà còn được gọi là subroutine [đoạn chương trình con], procedure [thủ tục] và subprocess [tiến trình con], v.v… Hàm là một chuỗi các chỉ thị được đóng gọi dưới dạng một đơn vị để thực hiện một tác vụ cụ thể. Khi logic của một hàm phức tạp được chia ra thành các hàm nhỏ hơn, thì các hàm nhỏ này được gọi là các helper function – hàm phụ trợ hoặc subroutines – các đoạn chương trình con.

Nội dung chính

  • 1. Coroutine và Thread
  • 3. Cơ chế thực thi của coroutine
  • 4. Cách đóng lại một Coroutine
  • 5. Ghép nối các coroutine để tạo ra đường ống
  • 6. Tài liệu tham khảo thêm

Subroutines – các đoạn chương trình con trong Puthon đều được gọi đến bởi main function – hàm main/hàm chính, cái mà chịu trách nhiệm điều phối việc sử dụng các đoạn chương trình con này. Các subroutines chỉ có một entry point [điểm để đi vào] duy nhất.

Coroutine là sự khái quát của subroutine [đoạn chương trình con]. Chúng thường được sử dụng cho xử lý đa nhiệm có tính kết hợp, trong đó một tiến trình [process] sẽ tự nguyện cho đi quyền điều khiển thực thi một cách định kỳ, hoặc khi tiến trình đó ở trạng thái nghỉ [idle], để cho phép nhiều ứng dụng có thể được chạy cùng lúc. Sự khác biệt giữa Coroutine và subroutine là:

– Không giống như các subroutines, các coroutines sở hữu rất nhiều entry points [điểm đi vào] phục vụ cho việc tạm dừng thực thi và tiếp tục thực thi. Coroutine có thể tạm dừng việc thực thi của nó và chuyển quyền điều khiển chương trình sang cho coroutine khác và có thể tiếp tục thực thi trở lại từ cái thời điểm mà nó đã cho đi quyền điều khiển.

  • 1. Coroutine và Thread
  • 3. Cơ chế thực thi của coroutine
  • 3. Cơ chế thực thi của coroutine
  • 4. Cách đóng lại một Coroutine
  • 5. Ghép nối các coroutine để tạo ra đường ống
  • 6. Tài liệu tham khảo thêm

1. Coroutine và Thread

3. Cơ chế thực thi của coroutine

4. Cách đóng lại một Coroutine

5. Ghép nối các coroutine để tạo ra đường ống

6. Tài liệu tham khảo thêm

Subroutines – các đoạn chương trình con trong Puthon đều được gọi đến bởi main function – hàm main/hàm chính, cái mà chịu trách nhiệm điều phối việc sử dụng các đoạn chương trình con này. Các subroutines chỉ có một entry point [điểm để đi vào] duy nhất.

Coroutine là sự khái quát của subroutine [đoạn chương trình con]. Chúng thường được sử dụng cho xử lý đa nhiệm có tính kết hợp, trong đó một tiến trình [process] sẽ tự nguyện cho đi quyền điều khiển thực thi một cách định kỳ, hoặc khi tiến trình đó ở trạng thái nghỉ [idle], để cho phép nhiều ứng dụng có thể được chạy cùng lúc. Sự khác biệt giữa Coroutine và subroutine là:

– Không giống như các subroutines, các coroutines sở hữu rất nhiều entry points [điểm đi vào] phục vụ cho việc tạm dừng thực thi và tiếp tục thực thi. Coroutine có thể tạm dừng việc thực thi của nó và chuyển quyền điều khiển chương trình sang cho coroutine khác và có thể tiếp tục thực thi trở lại từ cái thời điểm mà nó đã cho đi quyền điều khiển.

2. Coroutine trong Python

Tới đây, bạn có thể nghĩ rằng Coroutine và Thread khác nhau như thế nào, bởi vì dường như chúng đều thực hiện cùng một công việc.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: 
#Fanpage: //www.facebook.com/cafedevn
#Instagram: //instagram.com/cafedevn
#Twitter: //twitter.com/CafedeVn
#Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python3 program for demonstrating  
# coroutine execution 
  
def print_name[prefix]: 
    print["Searching prefix:{}".format[prefix]] 
    while True: 
        name = [yield] 
        if prefix in name: 
            print[name] 
  
# calling coroutine, nothing will happen 
corou = print_name["Dear"] 
  
# This will start execution of coroutine and  
# Prints first line "Searchig prefix..." 
# and advance execution to the first yield expression 
corou.__next__[] 
  
# sending inputs 
corou.send["Atul"] 
corou.send["Dear Atul"] 

Trong trường hợp các threads, Việc chuyển đổi giữa các threads theo một lịch trình cụ thể được thực hiện bởi hệ điều hành [hoặc run time environment – môi trường thời gian chạy]. Trong khi đối với các coroutine, các lập trình viên hoặc ngôn ngữ lập trình sẽ quyết định khi nào chuyển đổi giữa các coroutines. Các coroutines xử lý đa tác vụ một cách kết hợp bằng cách tạm dừng và trở lại thực thi tiếp tại một điểm/mốc được chỉ định bởi lập trình viên.

Searching prefix:Dear
Dear Atul

3. Cơ chế thực thi của coroutine

4. Cách đóng lại một Coroutine

4. Cách đóng lại một Coroutine

5. Ghép nối các coroutine để tạo ra đường ống


# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: 
#Fanpage: //www.facebook.com/cafedevn
#Instagram: //instagram.com/cafedevn
#Twitter: //twitter.com/CafedeVn
#Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------

# Python3 program for demonstrating 
# closing a coroutine 
  
def print_name[prefix]: 
    print["Searching prefix:{}".format[prefix]] 
    try :  
        while True: 
                name = [yield] 
                if prefix in name: 
                    print[name] 
    except GeneratorExit: 
            print["Closing coroutine!!"] 
  
corou = print_name["Dear"] 
corou.__next__[] 
corou.send["Cafedev"] 
corou.send["Dear Cafedev"] 
corou.close[] 

Trong trường hợp các threads, Việc chuyển đổi giữa các threads theo một lịch trình cụ thể được thực hiện bởi hệ điều hành [hoặc run time environment – môi trường thời gian chạy]. Trong khi đối với các coroutine, các lập trình viên hoặc ngôn ngữ lập trình sẽ quyết định khi nào chuyển đổi giữa các coroutines. Các coroutines xử lý đa tác vụ một cách kết hợp bằng cách tạm dừng và trở lại thực thi tiếp tại một điểm/mốc được chỉ định bởi lập trình viên.

Searching prefix:Dear
Dear Cafedev
Closing coroutine!!

5. Ghép nối các coroutine để tạo ra đường ống

6. Tài liệu tham khảo thêm

– Một cái initial source – nguồn khởi tạo [hay còn gọi là producer], cái mà sẽ dẫn xuất ra toàn bộ đường ống. Producer thường không phải là một coroutine, nó chỉ là một phương thức đơn giản.

– Một cái sink, là điểm cuối của đường ống dẫn. Một sink có thể thu thập tất cả dữ liệu và hiển thị chúng.

Dưới đây là một ví dụ đơn giản về chainning coroutines – ghép nối các coroutines

Đoạn code mô tả cơ chế coroutine chaining:


# Python3 program for demonstrating 
# coroutine chaining 
  
def producer[sentence, next_coroutine]: 
    ''' 
    Producer which just split strings and 
    feed it to pattern_filter coroutine 
    '''
    tokens = sentence.split[" "] 
    for token in tokens: 
        next_coroutine.send[token] 
    next_coroutine.close[] 
  
def pattern_filter[pattern="ing", next_coroutine=None]: 
    ''' 
    Search for pattern in received token  
    and if pattern got matched, send it to 
    print_token[] coroutine for printing 
    '''
    print["Searching for {}".format[pattern]] 
    try: 
        while True: 
            token = [yield] 
            if pattern in token: 
                next_coroutine.send[token] 
    except GeneratorExit: 
        print["Done with filtering!!"] 
  
def print_token[]: 
    ''' 
    Act as a sink, simply print the 
    received tokens 
    '''
    print["I'm sink, i'll print tokens"] 
    try: 
        while True: 
            token = [yield] 
            print[token] 
    except GeneratorExit: 
        print["Done with printing!"] 
  
pt = print_token[] 
pt.__next__[] 
pf = pattern_filter[next_coroutine = pt] 
pf.__next__[] 
  
sentence = "Bob is running behind a fast moving car"
producer[sentence, pf] 

Kết quả in ra là:

I'm sink, i'll print tokens
Searching for ing
running
moving
Done with filtering!!
Done with printing!

6. Tài liệu tham khảo thêm

Tài liệu tham khảo pdf

Wiki

Nguồn và Tài liệu tiếng anh tham khảo:

  • w3school
  • python.org
  • geeksforgeeks

Tài liệu từ cafedev:

  • Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
  • Ebook về python tại đây.
  • Các series tự học lập trình khác

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

  • Group Facebook
  • Fanpage
  • Youtube
  • Instagram
  • Twitter
  • Linkedin
  • Pinterest
  • Trang chủ

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!

Bài Viết Liên Quan

Chủ Đề