Tôi có thể bắt đầu bao nhiêu chủ đề trong Python?

Bạn có thể định cấu hình số luồng trong ThreadPoolExecutor bằng Python bằng cách đặt đối số max_workers

Trong hướng dẫn này, bạn sẽ khám phá cách định cấu hình số lượng luồng công nhân trong nhóm luồng Python

Bắt đầu nào

Mục lục

Cần cấu hình số lượng Worker Threads trong ThreadPoolExecutor

The ThreadPoolExecutor trong Python cung cấp một nhóm các luồng có thể tái sử dụng để thực thi các tác vụ đặc biệt.

Bạn có thể gửi tác vụ tới nhóm luồng bằng cách gọi submit[] function and passing in the name of the function you wish to execute on another thread. You can also submit tasks by calling the map[] và chỉ định .

Nhóm luồng có một số luồng công nhân cố định

Điều quan trọng là phải giới hạn số lượng luồng công nhân trong nhóm luồng ở số lượng tác vụ không đồng bộ mà bạn muốn hoàn thành, dựa trên tài nguyên trong hệ thống của bạn hoặc trên số lượng tài nguyên bạn định sử dụng trong các tác vụ của mình

Ngoài ra, bạn có thể muốn tăng đáng kể số lượng luồng công nhân, với dung lượng lớn hơn trong các tài nguyên bạn định sử dụng

Làm cách nào để bạn định cấu hình số lượng luồng công nhân trong

ThreadPoolExecutor?

Chạy các vòng lặp của bạn bằng cách sử dụng tất cả các CPU, tải xuống cuốn sách MIỄN PHÍ của tôi để tìm hiểu cách thực hiện

Cách định cấu hình số lượng luồng công nhân

Bạn có thể định cấu hình số lượng luồng công nhân trong

ThreadPoolExecutor bằng cách đặt max_workerstrong hàm tạo

Ví dụ

1

2

3

4

5

6

.. .

# tạo nhóm luồng và đặt số lượng luồng công nhân

executor = ThreadPoolExecutor[max_workers=100]

#

# tắt nhóm chủ đề

người thi hành. tắt máy[]

Các

max_workersđối số là đối số đầu tiên trong hàm tạo và không cần được chỉ định theo tên để được đặt;

1

2

3

.. .

# tạo nhóm luồng và đặt số lượng luồng công nhân

người thi hành = Người thi hành ThreadPool[100]

Nếu bạn đang sử dụng trình quản lý ngữ cảnh để tạo nhóm luồng để nó tự động tắt, thì bạn có thể định cấu hình số lượng luồng theo cách tương tự

Ví dụ

1

2

3

4

.. .

# tạo nhóm luồng bằng trình quản lý bối cảnh và đặt số lượng công nhân

với ThreadPoolExecutor[50] as executor:

#

Nó lấy một số nguyên dương và mặc định là số lượng CPU trong hệ thống của bạn cộng với bốn

  • Tổng số Worker Threads = [CPU trong hệ thống của bạn] + 4

Ví dụ: nếu bạn có 2 CPU vật lý trong hệ thống của mình và mỗi CPU đều có siêu phân luồng [phổ biến ở các CPU hiện đại] thì bạn sẽ có 2 CPU vật lý và 4 CPU logic. Python sẽ thấy 4 CPU. Số luồng công nhân mặc định trên hệ thống của bạn khi đó sẽ là [4 + 4] hoặc 8

Nếu con số này lớn hơn 32 [e. g. 16 lõi vật lý, 32 lõi logic, cộng với bốn lõi], mặc định sẽ cắt giới hạn trên thành 32 luồng

Thông thường có nhiều luồng hơn CPU [vật lý hoặc logic] trong hệ thống của bạn

Lý do cho điều này là các luồng được sử dụng cho các tác vụ liên kết với IO, không phải các tác vụ liên quan đến CPU. Điều này có nghĩa là các luồng được sử dụng cho các tác vụ chờ tài nguyên phản hồi tương đối chậm, chẳng hạn như ổ đĩa cứng, ổ đĩa DVD, máy in, kết nối mạng, v.v. Chúng tôi sẽ thảo luận về ứng dụng tốt nhất của chủ đề trong phần sau

Do đó, không có gì lạ khi có hàng chục, hàng trăm và thậm chí hàng nghìn luồng trong ứng dụng của bạn, tùy thuộc vào nhu cầu cụ thể của bạn. Không bình thường khi có nhiều hơn một hoặc vài nghìn chủ đề. Nếu bạn yêu cầu nhiều luồng này, thì các giải pháp thay thế có thể được ưu tiên hơn, chẳng hạn như AsyncIO

Bây giờ chúng ta đã biết cách định cấu hình số luồng công nhân trong

ThreadPoolExecutor, hãy xem một ví dụ hoạt động

Bị bối rối bởi API lớp ThreadPoolExecutor?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi

Kiểm tra số lượng chủ đề công nhân mặc định

Hãy kiểm tra xem có bao nhiêu luồng được tạo cho nhóm luồng trên hệ thống của bạn

Nhìn vào mã nguồn cho

ThreadPoolExecutor , chúng ta có thể thấy rằng số lượng chuỗi worker được chọn theo mặc định được lưu trữ trong thuộc tính _max_workersthuộc tính mà chúng ta có thể truy cập và báo cáo sau khi nhóm luồng được tạo

Ghi chú,

_max_workerslà thành viên được bảo vệ và có thể thay đổi trong tương lai

Ví dụ bên dưới báo cáo số lượng luồng mặc định trong nhóm luồng trên hệ thống của bạn

1

2

3

4

5

6

7

#Trăn Siêu Nhanh. com

# báo cáo số chuỗi worker mặc định trên hệ thống của bạn

từ đồng thời. tương lai nhập ThreadPoolExecutor

# tạo nhóm luồng với số lượng luồng công nhân mặc định

người thi hành = Người thi hành ThreadPool[]

# báo cáo số lượng luồng công nhân được chọn theo mặc định

in[người thi hành. _max_workers]

Chạy ví dụ này báo cáo số lượng worker thread được sử dụng theo mặc định trên hệ thống của bạn

Tôi có bốn lõi CPU vật lý, tám lõi logic, do đó mặc định là 8 + 4 hoặc 12 luồng

1

12

Có bao nhiêu luồng công nhân được phân bổ theo mặc định trên hệ thống của bạn?
Hãy cho tôi biết trong các ý kiến ​​dưới đây

Khóa học Python ThreadPoolExecutor miễn phí

Tải xuống bảng gian lận API ThreadPoolExecutor của tôi và như một phần thưởng, bạn sẽ có quyền truy cập MIỄN PHÍ vào khóa học email 7 ngày của tôi

Khám phá cách sử dụng lớp ThreadPoolExecutor bao gồm cách định cấu hình số lượng công nhân và cách thực thi tác vụ không đồng bộ

Tìm hiểu thêm
 

Ví dụ về cấu hình số lượng chủ đề công nhân

Chúng ta có thể chỉ định trực tiếp số lượng chuỗi công nhân và đây là một ý tưởng hay trong hầu hết các ứng dụng

Ví dụ dưới đây trình bày cách định cấu hình 500 luồng công nhân

1

2

3

4

5

6

7

#Trăn Siêu Nhanh. com

# định cấu hình và báo cáo số chuỗi worker mặc định

từ đồng thời. tương lai nhập ThreadPoolExecutor

# tạo nhóm luồng với số lượng lớn luồng công nhân

với ThreadPoolExecutor[500] as executor:

# báo cáo số lượng chủ đề công nhân

in[người thi hành. _max_workers]

Chạy ví dụ này sẽ định cấu hình nhóm luồng để sử dụng 500 luồng và xác nhận rằng nó sẽ tạo 500 luồng

1

500

Bị choáng ngợp bởi các API đồng thời python?
Tìm sự giải thoát, tải xuống Bản đồ tư duy đồng thời Python MIỄN PHÍ của tôi

Câu hỏi thường gặp

Phần này liệt kê các câu hỏi phổ biến liên quan đến số chuỗi worker trong

ThreadPoolExecutor .

Bạn có một câu hỏi về việc thiết lập số lượng chủ đề?
Hãy cho tôi biết trong các nhận xét và tôi sẽ cố gắng hết sức để trả lời và thêm nó vào phần này

Số lượng chủ đề mặc định trong ThreadPoolExecutor là gì?

Số lượng chủ đề mặc định trong ThreadPoolExecutor được tính như sau

  • Tổng số Worker Threads = [CPU trong hệ thống của bạn] + 4

Trường hợp số lượng CPU trong hệ thống của bạn được xác định bởi Python và sẽ tính đến siêu phân luồng

Ví dụ: nếu bạn có hai lõi CPU, mỗi lõi có siêu phân luồng [phổ biến], thì Python sẽ “thấy” bốn CPU trong hệ thống của bạn

Tôi có bao nhiêu CPU hoặc lõi CPU?

Bạn có thể kiểm tra số lượng CPU hoặc lõi CPU mà Python có thể nhìn thấy thông qua cpu_count[] function in the os module.

Ví dụ: chương trình sau sẽ báo cáo số lượng lõi CPU trong hệ thống của bạn mà Python có thể nhìn thấy

1

2

3

# báo cáo số lượng CPU trong hệ thống của bạn hiển thị với Python

nhập os

in[os. số lượng cpu[]]

Số lượng luồng trong ThreadPoolExecutor có khớp với số lượng CPU hoặc lõi không?

Số lượng chủ đề công nhân trong

ThreadPoolExecutorkhông liên quan đến số lượng CPU hoặc lõi CPU trong hệ thống của bạn

Bạn có thể định cấu hình số lượng luồng dựa trên số lượng tác vụ bạn cần thực thi, lượng tài nguyên hệ thống cục bộ mà bạn có sẵn [e. g. bộ nhớ], và những hạn chế của tài nguyên mà bạn định truy cập trong nhiệm vụ của mình [e. g. kết nối với máy chủ từ xa]

Tôi nên sử dụng bao nhiêu chủ đề?

Nếu bạn có hàng trăm tác vụ, có lẽ bạn nên đặt số lượng luồng bằng với số lượng tác vụ

Nếu bạn có hàng nghìn tác vụ, có lẽ bạn nên giới hạn số lượng chuỗi ở mức hàng trăm hoặc 1.000

Nếu ứng dụng của bạn dự định sẽ được thực thi nhiều lần trong tương lai, bạn có thể kiểm tra số lượng luồng khác nhau và so sánh thời gian thực hiện tổng thể, sau đó chọn một số luồng mang lại hiệu suất xấp xỉ tốt nhất. Bạn có thể muốn giả lập tác vụ trong các thử nghiệm này bằng thao tác ngủ ngẫu nhiên

Số lượng chủ đề công nhân tối đa trong ThreadPoolExecutor là bao nhiêu?

Không có số lượng worker thread tối đa trong ThreadPoolExecutor

Tuy nhiên, hệ thống của bạn sẽ có giới hạn trên về số luồng bạn có thể tạo dựa trên dung lượng bộ nhớ chính [RAM] hiện có của bạn

Trước khi bạn vượt quá bộ nhớ chính, bạn sẽ đạt đến điểm lợi nhuận giảm dần khi thêm các luồng mới và thực hiện nhiều tác vụ hơn. Điều này là do hệ điều hành của bạn phải chuyển đổi giữa các luồng, được gọi là chuyển ngữ cảnh. Với quá nhiều luồng hoạt động cùng một lúc, chương trình của bạn có thể dành nhiều thời gian hơn để chuyển ngữ cảnh hơn là thực sự thực hiện các tác vụ

Giới hạn trên hợp lý cho nhiều ứng dụng là hàng trăm luồng đến có lẽ vài nghìn luồng. Hơn vài nghìn luồng trên một hệ thống hiện đại có thể dẫn đến quá nhiều chuyển ngữ cảnh, tùy thuộc vào hệ thống của bạn và loại tác vụ đang được thực thi

Bạn có thể bắt đầu một chuỗi nhiều lần Python không?

Gọi hàm start[] trên một chuỗi đã kết thúc sẽ dẫn đến RuntimeError cho biết rằng các chuỗi chỉ có thể được bắt đầu một lần . Thay vào đó, để khởi động lại một luồng trong Python, bạn phải tạo một phiên bản mới của luồng có cùng cấu hình và sau đó gọi hàm start[].

Bạn có thể chạy nhiều luồng trong Python không?

Tóm lại, phân luồng trong Python cho phép nhiều luồng được tạo trong một quy trình duy nhất , nhưng do GIL, sẽ không có luồng nào trong số đó . Phân luồng vẫn là một tùy chọn rất tốt khi chạy đồng thời nhiều tác vụ ràng buộc I/O.

Tôi có thể sinh ra bao nhiêu chủ đề?

các cửa sổ. Trên các máy Windows, không có giới hạn nào được chỉ định cho các luồng. Do đó, chúng tôi có thể tạo bao nhiêu luồng tùy thích, cho đến khi hệ thống của chúng tôi hết bộ nhớ hệ thống khả dụng

Tôi có thể chạy bao nhiêu chủ đề cho mỗi quy trình?

Tham số kernel threads-max kiểm soát số lượng luồng tối đa . Tham số này được xác định trong tệp /proc/sys/kernel/threads-max. Ở đây, đầu ra 63704 chỉ ra rằng hạt nhân có thể thực thi tối đa 63.704 luồng.

Chủ Đề