ThreadPoolExecutor hoạt động như thế nào trong Python?

Giả sử chúng ta phải tạo một số lượng lớn luồng cho các tác vụ đa luồng của mình. Nó sẽ tốn kém nhất về mặt tính toán vì có thể có nhiều vấn đề về hiệu suất do có quá nhiều luồng. Một vấn đề lớn có thể là thông lượng bị hạn chế. Chúng ta có thể giải quyết vấn đề này bằng cách tạo một nhóm chủ đề. Nhóm luồng có thể được định nghĩa là nhóm các luồng được khởi tạo trước và không hoạt động, sẵn sàng hoạt động. Tạo nhóm luồng được ưu tiên hơn so với khởi tạo luồng mới cho mọi tác vụ khi chúng ta cần thực hiện số lượng lớn tác vụ. Nhóm luồng có thể quản lý việc thực thi đồng thời số lượng lớn luồng như sau -

  • Nếu một luồng trong nhóm luồng hoàn tất quá trình thực thi thì luồng đó có thể được sử dụng lại

  • Nếu một luồng bị chấm dứt, một luồng khác sẽ được tạo để thay thế luồng đó

Mô-đun Python – Đồng thời. tương lai

Thư viện chuẩn Python bao gồm đồng thời. mô-đun tương lai. Mô-đun này đã được thêm vào Python 3. 2 để cung cấp cho các nhà phát triển giao diện cấp cao để khởi chạy các tác vụ không đồng bộ. Nó là một lớp trừu tượng ở trên cùng của các mô-đun xử lý và xử lý đa luồng của Python để cung cấp giao diện để chạy các tác vụ bằng cách sử dụng nhóm luồng hoặc quy trình

Trong các phần tiếp theo của chúng ta, chúng ta sẽ tìm hiểu về các lớp khác nhau của concurrent. mô-đun tương lai

lớp chấp hành viên

Executoris một lớp trừu tượng của đồng thời. mô-đun Python tương lai. Nó không thể được sử dụng trực tiếp và chúng ta cần sử dụng một trong các lớp con cụ thể sau -

  • ThreadPoolExecutor
  • Quá TrìnhBể BơiExecutor

ThreadPoolExecutor – Một lớp con cụ thể

Nó là một trong những lớp con cụ thể của lớp Executor. Lớp con sử dụng đa luồng và chúng tôi nhận được một nhóm luồng để gửi các tác vụ. Nhóm này gán nhiệm vụ cho các luồng có sẵn và lên lịch chạy chúng

Làm cách nào để tạo ThreadPoolExecutor?

Với sự giúp đỡ của đồng thời. futures và Executor lớp con cụ thể của nó, chúng ta có thể dễ dàng tạo một nhóm các chủ đề. Đối với điều này, chúng ta cần xây dựng một ThreadPoolExecutor với số lượng luồng mà chúng ta muốn trong nhóm. Theo mặc định, số là 5. Sau đó, chúng ta có thể gửi một tác vụ đến nhóm luồng. Khi chúng tôi gửi [] một nhiệm vụ, chúng tôi sẽ nhận lại một Tương lai. Đối tượng Tương lai có một phương thức gọi là done[], cho biết liệu tương lai đã được giải quyết chưa. Với điều này, một giá trị đã được đặt cho đối tượng tương lai cụ thể đó. Khi một tác vụ kết thúc, trình thực thi nhóm luồng sẽ đặt giá trị cho đối tượng trong tương lai

Thí dụ

from concurrent.futures import ThreadPoolExecutor
from time import sleep
def task[message]:
   sleep[2]
   return message

def main[]:
   executor = ThreadPoolExecutor[5]
   future = executor.submit[task, ["Completed"]]
   print[future.done[]]
   sleep[2]
   print[future.done[]]
   print[future.result[]]
if __name__ == '__main__':
main[]

đầu ra

False
True
Completed

Trong ví dụ trên, một ThreadPoolExecutor đã được xây dựng với 5 luồng. Sau đó, một tác vụ sẽ đợi trong 2 giây trước khi đưa ra thông báo, được gửi tới bộ thực thi nhóm luồng. Như đã thấy từ đầu ra, tác vụ không hoàn thành cho đến 2 giây, vì vậy lệnh gọi đầu tiên đến done[] sẽ trả về Sai. Sau 2 giây, nhiệm vụ được thực hiện và chúng ta nhận được kết quả của tương lai bằng cách gọi phương thức result[] trên đó

Khởi tạo ThreadPoolExecutor – Trình quản lý ngữ cảnh

Một cách khác để khởi tạo ThreadPoolExecutor là với sự trợ giúp của trình quản lý bối cảnh. Nó hoạt động tương tự như phương pháp được sử dụng trong ví dụ trên. Ưu điểm chính của việc sử dụng trình quản lý bối cảnh là nó có vẻ tốt về mặt cú pháp. Việc khởi tạo có thể được thực hiện với sự trợ giúp của đoạn mã sau -

with ThreadPoolExecutor[max_workers = 5] as executor

Thí dụ

Ví dụ sau được mượn từ tài liệu Python. Trong ví dụ này, trước hết là đồng thời. mô-đun tương lai phải được nhập khẩu. Sau đó, một hàm có tên load_url[] được tạo sẽ tải url được yêu cầu. Sau đó, hàm tạo ThreadPoolExecutor với 5 luồng trong nhóm. ThreadPoolExecutor đã được sử dụng làm trình quản lý ngữ cảnh. Chúng ta có thể lấy kết quả của tương lai bằng cách gọi phương thức result[] trên đó

import concurrent.futures
import urllib.request

URLS = ['//www.foxnews.com/',
   '//www.cnn.com/',
   '//europe.wsj.com/',
   '//www.bbc.co.uk/',
   '//some-made-up-domain.com/']

def load_url[url, timeout]:
   with urllib.request.urlopen[url, timeout = timeout] as conn:
   return conn.read[]

with concurrent.futures.ThreadPoolExecutor[max_workers = 5] as executor:

   future_to_url = {executor.submit[load_url, url, 60]: url for url in URLS}
   for future in concurrent.futures.as_completed[future_to_url]:
   url = future_to_url[future]
   try:
      data = future.result[]
   except Exception as exc:
      print['%r generated an exception: %s' % [url, exc]]
   else:
      print['%r page is %d bytes' % [url, len[data]]]

đầu ra

Sau đây sẽ là đầu ra của tập lệnh Python ở trên -

'//some-made-up-domain.com/' generated an exception: 
'//www.foxnews.com/' page is 229313 bytes
'//www.cnn.com/' page is 168933 bytes
'//www.bbc.co.uk/' page is 283893 bytes
'//europe.wsj.com/' page is 938109 bytes

Sử dụng Executor. hàm map[]

Hàm map[] trong Python được sử dụng rộng rãi trong một số tác vụ. Một nhiệm vụ như vậy là áp dụng một chức năng nhất định cho mọi phần tử trong iterables. Tương tự như vậy, chúng ta có thể ánh xạ tất cả các phần tử của trình vòng lặp tới một hàm và gửi chúng dưới dạng các công việc độc lập ra ThreadPoolExecutor. Xem xét ví dụ sau về tập lệnh Python để hiểu cách thức hoạt động của hàm

Thí dụ

Trong ví dụ dưới đây, hàm map được sử dụng để áp dụng hàm square[] cho mọi giá trị trong mảng giá trị

Trình thực thi nhóm luồng hoạt động nội bộ như thế nào?

ThreadPool Executor có CorePoolSize chi phối số lượng chủ đề đang hoạt động xuất hiện, với mọi yêu cầu đến. Khi các luồng CorePoolSize đang hoạt động, các tác vụ sắp tới mới sẽ được thêm vào Hàng đợi và các luồng này đang tích cực bỏ phiếu từ Hàng đợi để thực thi chúng .

Là chủ đề Python ThreadPoolExecutor

An toàn luồng ThreadPoolExecutor . Tuy nhiên, khi truy cập tài nguyên hoặc các phần quan trọng, sự an toàn của chuỗi có thể là mối quan tâm .

Chủ Đề