Computer >> Máy Tính >  >> Lập trình >> Python

Làm thế nào để triển khai Concurrency với Threads trong Python?

Giới thiệu

Python có các cách tiếp cận khác nhau như sử dụng các luồng, quy trình con, trình tạo và các thủ thuật khác để lập trình đồng thời.

Đồng thời là một phần của logic Trong một chương trình duy nhất cho phép mở ra nhiều đường thực thi khác nhau, bao gồm các luồng I / O riêng biệt, chạy các truy vấn SQL, do đó, theo cách mà việc thực thi dường như đồng thời và phụ thuộc lẫn nhau .

Cách thực hiện ..

Đầu tiên, chúng tôi tạo một luồng duy nhất để đi qua các url của trang web và sau đó xem cách sử dụng các khái niệm về luồng để tăng tốc chương trình.

 # Bước 1 - Lập danh sách url trang web bạn muốn truy cập ngay hôm nay nhập requeststutorialpoints_url =['https://www.tutorialspoint.com/python/index.htm','https://www.tutorialspoint.com/ cplusplus / index.htm ',' https://www.tutorialspoint.com/java/index.htm','https://www.tutorialspoint.com/html/index.htm','https:// www. tutorialspoint.com/cprogramming/index.htm '] 


 # hàm để yêu cầu url được chuyển và trả về trạng thái mã hóa visit_site (site_url):"" "Thực hiện yêu cầu GET đối với URL trang web và in thông tin phản hồi" "" response =request.get (site_url) print (f ' *** {site_url} đã trả lại {response.status_code} sau {response.elapsed} giây ') 


 # Hãy để chúng tôi tạo một chuỗi duy nhất để tìm nạp phản hồi nếu __name__ =='__main __':cho site_url trong tutorialpoints_url:visit_site (site_url) print (f "*** end of the program ***") 


 *** https://www.tutorialspoint.com/python/index.htm trả về 200 sau 0:00:00.091103 giây *** https://www.tutorialspoint.com/cplusplus/index.htm trả về 200 sau 0:00:00.069889 giây *** https://www.tutorialspoint.com/java/index.htm trả về 200 sau 0:00:00.075864 giây *** https://www.tutorialspoint.com/html/index .htm trả về 200 sau 0:00:00.075270 giây *** https://www.tutorialspoint.com/cprogramming/index.htm trả về 200 sau 0:00:00.077984 giây *** kết thúc chương trình ***  

Bạn đã quan sát được gì từ đầu ra? Url của trang web được xử lý tuần tự, chỉ cần tưởng tượng nếu có 100 url từ các vị trí địa lý khác nhau mà bạn muốn truy cập thì chương trình của bạn có thể mất rất nhiều thời gian để chờ phản hồi từ máy chủ.

Bây giờ chúng ta hãy viết một chương trình phân luồng để gửi các yêu cầu song song và tiến hành bước tiếp theo mà không cần chờ đợi.

 from threading import Chức năng Thread # để yêu cầu url được truyền và trả về trạng thái codedef visit_site (site_url):"" "Thực hiện yêu cầu GET đến URL trang web và in thông tin phản hồi" "" response =request.get (site_url) print (f '*** {site_url} đã trả về {response.status_code} sau {response.elapsed} giây') # Vòng qua url của trang web và tạo chuỗi cho mỗi urlif __name__ =='__main __':cho site_url trong tutorialpoints_url:t =Chủ đề (target =visit_site, args =(site_url,)) t.start () 


 *** https://www.tutorialspoint.com/python/index.htm trả về 200 sau 0:00:00.082176 giây *** https://www.tutorialspoint.com/html/index.htm trả về 200 sau 0:00:00.086269 giây *** https://www.tutorialspoint.com/java/index.htm trả về 200 sau 0:00:00.100746 giây *** https://www.tutorialspoint.com/cplusplus/index .htm trả lại 200 sau 0:00:00.120744 giây *** https://www.tutorialspoint.com/cprogramming/index.htm trả lại 200 sau 0:00:00.111489 giây 

Thảo luận ..

  • Thư viện luồng có thể được sử dụng để thực thi bất kỳ Python nào có thể gọi được trong luồng của chính nó.

  • Phương thức start () gọi hàm visit_site với các đối số site_url.

  • Các luồng sau khi bắt đầu được thực thi trong luồng riêng của chúng được Hệ điều hành quản lý hoàn toàn.

Bây giờ, nếu bạn muốn xem chuỗi của bạn còn sống hay đã chết (đã hoàn thành), chúng ta có thể sử dụng hàm is_alive.

 if t.is_alive ():print (f '*** {t} vẫn đang thực thi') else:print (f '*** {t} is Complete') 


 ***  đã hoàn thành