Có bao nhiêu chủ đề là quá nhiều?


312

Tôi đang viết một máy chủ và tôi gửi từng hành động vào một luồng riêng khi nhận được yêu cầu. Tôi làm điều này bởi vì hầu hết mọi yêu cầu tạo ra một truy vấn cơ sở dữ liệu. Tôi đang sử dụng một thư viện threadpool để cắt giảm việc xây dựng / phá hủy các chủ đề.

Câu hỏi của tôi là: điểm cắt tốt cho các luồng I / O như thế này là gì? Tôi biết đó chỉ là một ước tính sơ bộ, nhưng chúng ta đang nói chuyện hàng trăm? Hàng ngàn?

Làm thế nào tôi có thể tìm ra điểm cắt này sẽ là gì?


BIÊN TẬP:

Cảm ơn tất cả các câu trả lời của bạn, có vẻ như tôi sẽ phải kiểm tra nó để tìm ra trần nhà của tôi. Câu hỏi là: làm sao tôi biết tôi đã chạm trần? Chính xác những gì tôi nên đo?


1
@ryeguy: Toàn bộ vấn đề ở đây là bạn không nên thiết lập bất kỳ mức tối đa nào trong luồng này nếu không có vấn đề về hiệu năng để bắt đầu. Hầu hết các lời khuyên về việc giới hạn một luồng xử lý xuống ~ 100 luồng là vô lý, hầu hết các nhóm luồng có / cách / nhiều luồng hơn thế và không bao giờ có vấn đề.
GEOCHET

ryeguy, xem thêm câu trả lời của tôi dưới đây những gì cần đo.
paxdiablo

Đừng quên rằng Python về bản chất, không thực sự thân thiện với nhiều luồng. Tại bất kỳ thời điểm nào, một opcode mã byte đơn đang được thực thi. Điều này là do Python sử dụng Khóa phiên dịch toàn cầu.
HỎI

1
@Jay D: Tôi muốn nói rằng khoảnh khắc bạn chạm trần là khi hiệu suất của bạn bắt đầu giảm.
ninjalj

6
@GEOCHET "Toàn bộ vấn đề ở đây là bạn không nên đặt bất kỳ mức tối đa nào trong luồng" Ummm ... nói gì? Nhóm luồng kích thước cố định có lợi ích của sự xuống cấp duyên dáng và khả năng mở rộng. Ví dụ: trong cài đặt mạng, nếu bạn sinh ra các luồng mới dựa trên các kết nối máy khách, không có kích thước nhóm cố định, bạn sẽ gặp nguy hiểm rất lớn khi học ( cách khó ) chỉ có bao nhiêu luồng máy chủ của bạn có thể xử lý và mỗi máy khách được kết nối sẽ chịu đựng. Một hồ bơi có kích thước cố định hoạt động giống như một van đường ống bằng cách không cho phép máy chủ của bạn cố gắng cắn nhiều hơn mức có thể nhai.
b1nary.atr0phy

Câu trả lời:


206

Một số người sẽ nói rằng hai chủ đề là quá nhiều - Tôi không hoàn toàn ở trong trại đó :-)

Đây là lời khuyên của tôi: đo lường, đừng đoán. Một đề xuất là làm cho nó có thể cấu hình được và ban đầu đặt nó thành 100, sau đó phát hành phần mềm của bạn ra ngoài và theo dõi những gì xảy ra.

Nếu mức sử dụng luồng của bạn đạt cực đại ở mức 3, thì 100 là quá nhiều. Nếu nó vẫn ở mức 100 trong hầu hết thời gian trong ngày, hãy nâng nó lên tới 200 và xem điều gì sẽ xảy ra.

Bạn thực sự có thể có mã của mình theo dõi việc sử dụng và điều chỉnh cấu hình cho lần khởi động tiếp theo nhưng điều đó có thể là quá mức cần thiết.


Để làm rõ và xây dựng:

Tôi không ủng hộ việc lăn hệ thống con tổng hợp luồng của riêng bạn, bằng mọi cách sử dụng cái bạn có. Nhưng, vì bạn đã hỏi về một điểm giới hạn tốt cho các luồng, tôi cho rằng việc triển khai nhóm luồng của bạn có khả năng giới hạn số lượng luồng tối đa được tạo (đó là một điều tốt).

Tôi đã viết mã tổng hợp kết nối cơ sở dữ liệu và kết nối cơ sở dữ liệu và chúng có các tính năng sau (mà tôi tin là cần thiết cho hiệu suất):

  • một số lượng tối thiểu của các chủ đề hoạt động.
  • số lượng chủ đề tối đa.
  • tắt các chủ đề đã không được sử dụng trong một thời gian.

Cái đầu tiên đặt đường cơ sở cho hiệu suất tối thiểu về mặt máy khách nhóm luồng (số lượng luồng này luôn có sẵn để sử dụng). Thứ hai đặt ra một hạn chế về việc sử dụng tài nguyên bởi các luồng hoạt động. Thứ ba đưa bạn trở lại đường cơ sở trong thời gian yên tĩnh để giảm thiểu việc sử dụng tài nguyên.

Bạn cần cân bằng việc sử dụng tài nguyên khi có các luồng không sử dụng (A) so với việc sử dụng tài nguyên không có đủ luồng để thực hiện công việc (B).

(A) nói chung là sử dụng bộ nhớ (ngăn xếp, v.v.) vì một luồng không hoạt động sẽ không sử dụng nhiều CPU. (B) nói chung sẽ là một sự chậm trễ trong việc xử lý các yêu cầu khi chúng đến khi bạn cần đợi một chuỗi có sẵn.

Đó là lý do tại sao bạn đo lường. Như bạn nêu, phần lớn các chủ đề của bạn sẽ chờ phản hồi từ cơ sở dữ liệu để chúng không chạy. Có hai yếu tố ảnh hưởng đến số lượng chủ đề bạn nên cho phép.

Đầu tiên là số lượng kết nối DB có sẵn. Đây có thể là một giới hạn cứng trừ khi bạn có thể tăng nó tại DBMS - Tôi sẽ giả định rằng DBMS của bạn có thể có số lượng kết nối không giới hạn trong trường hợp này (mặc dù bạn cũng nên đo lường điều đó).

Sau đó, số lượng chủ đề bạn nên có phụ thuộc vào sử dụng lịch sử của bạn. Mức tối thiểu bạn nên chạy là số lượng tối thiểu bạn từng chạy + A%, với mức tối thiểu tuyệt đối (ví dụ: và làm cho nó có thể định cấu hình giống như A) 5.

Số lượng chủ đề tối đa phải là tối đa lịch sử của bạn + B%.

Bạn cũng nên theo dõi để thay đổi hành vi. Nếu, vì một số lý do, việc sử dụng của bạn đạt 100% khả dụng trong một thời gian đáng kể (để nó ảnh hưởng đến hiệu suất của khách hàng), bạn nên tăng tối đa cho phép cho đến khi cao hơn B% một lần nữa.


Để đáp lại "chính xác những gì tôi nên đo?" câu hỏi:

Những gì bạn nên đo cụ thể là số lượng luồng tối đa được sử dụng đồng thời (ví dụ, chờ đợi khi trả về từ cuộc gọi DB) trong khi tải. Sau đó, thêm hệ số an toàn 10% chẳng hạn (nhấn mạnh, vì các áp phích khác dường như lấy ví dụ của tôi làm đề xuất cố định).

Ngoài ra, điều này nên được thực hiện trong môi trường sản xuất để điều chỉnh. Bạn có thể ước tính trước được nhưng bạn không bao giờ biết sản xuất nào sẽ theo cách của bạn (đó là lý do tại sao tất cả những thứ này nên được cấu hình trong thời gian chạy). Điều này là để nắm bắt một tình huống như nhân đôi các cuộc gọi của khách hàng đến bất ngờ.


Nếu các luồng được sinh ra trên các yêu cầu đến thì việc sử dụng luồng sẽ phản ánh số lượng yêu cầu không được giám sát. Không có cách nào để xác định số "tối ưu" từ số này. Thật vậy, bạn sẽ tìm thấy nhiều luồng hơn gây ra tranh chấp tài nguyên nhiều hơn và do đó số lượng luồng hoạt động sẽ tăng lên.
Andrew Grant

@Andrew, việc tạo chủ đề mất nhiều thời gian và bạn có thể xác định số lượng tối ưu dựa trên dữ liệu lịch sử [+ N%] (do đó, không nên đoán). Ngoài ra, nhiều luồng hơn chỉ gây ra tranh chấp tài nguyên khi họ đang làm việc chứ không phải chờ tín hiệu / semaphore.
paxdiablo

Dữ liệu này ở đâu trong 'tạo luồng' gây ra vấn đề về hiệu năng khi sử dụng nhóm luồng? Nhóm luồng tốt sẽ không tạo và hủy các luồng ở giữa các tác vụ.
GEOCHET

@Pax Nếu tất cả các chủ đề của bạn đang chờ đợi trên cùng một ngữ nghĩa để chạy các truy vấn DB thì đó chính là định nghĩa của sự tranh chấp. Cũng không đúng khi nói các chủ đề không tốn bất cứ chi phí nào nếu họ đang chờ đợi trên một semaphore.
Andrew Grant

1
@Andrew, tôi không thể hiểu tại sao bạn lại chặn các truy vấn DB, bất kỳ DB tốt nào cũng sẽ cho phép truy cập đồng thời, với nhiều luồng đang chờ phản hồi. Và các chủ đề không nên tốn bất kỳ thời gian thực hiện nào trong khi semaphore bị chặn, chúng nên ngồi trong hàng đợi bị chặn cho đến khi semaphore được phát hành.
paxdiablo

36

Câu hỏi này đã được thảo luận khá kỹ lưỡng và tôi không có cơ hội đọc tất cả các câu trả lời. Nhưng đây là một vài điều cần xem xét trong khi xem xét giới hạn trên về số lượng các luồng đồng thời có thể cùng tồn tại trong một hệ thống nhất định.

  1. Kích thước ngăn xếp luồng: Trong Linux, kích thước ngăn xếp luồng mặc định là 8 MB (bạn có thể sử dụng ulimit -a để tìm ra nó).
  2. Bộ nhớ ảo tối đa mà một biến thể HĐH đã cho hỗ trợ. Linux Kernel 2.4 hỗ trợ không gian địa chỉ bộ nhớ là 2 GB. với Kernel 2.6, tôi lớn hơn một chút (3GB)
  3. [1] hiển thị các tính toán cho số lượng luồng tối đa trên mỗi VM tối đa được hỗ trợ. Đối với 2.4, hóa ra là khoảng 255 chủ đề. cho 2,6 số lượng lớn hơn một chút.
  4. Bạn có lịch trình kernel kindda nào. So sánh bộ lập lịch kernel Linux 2.4 với 2.6, cái sau cung cấp cho bạn một lịch trình O (1) mà không phụ thuộc vào số lượng tác vụ hiện có trong một hệ thống trong khi cái đầu tiên là nhiều hơn O (n). Do đó, Khả năng SMP của lịch trình kernel cũng đóng một vai trò tốt trong số lượng tối đa các luồng bền vững trong một hệ thống.

Bây giờ bạn có thể điều chỉnh kích thước ngăn xếp của mình để kết hợp nhiều luồng hơn nhưng sau đó bạn phải tính đến các chi phí quản lý luồng (tạo / hủy và lập lịch). Bạn có thể thực thi ái lực của CPU đối với một quy trình nhất định cũng như với một luồng đã cho để buộc chúng xuống các CPU cụ thể để tránh các chi phí di chuyển luồng giữa các CPU và tránh các vấn đề về tiền mặt lạnh.

Lưu ý rằng người ta có thể tạo ra hàng ngàn luồng theo ý muốn của mình, nhưng khi Linux hết VM, nó chỉ ngẫu nhiên bắt đầu giết các tiến trình (do đó là các luồng). Điều này là để giữ cho hồ sơ tiện ích không bị tối đa. (Hàm tiện ích cho biết về tiện ích toàn hệ thống đối với một lượng tài nguyên nhất định. Với tài nguyên không đổi trong trường hợp này là CPU Chu kỳ và Bộ nhớ, đường cong tiện ích sẽ làm phẳng với số lượng tác vụ ngày càng nhiều).

Tôi chắc chắn trình lập lịch trình kernel kernel cũng làm một cái gì đó thuộc loại này để xử lý việc sử dụng quá mức các tài nguyên

[1] http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux-what-is-the-solutions/


17

Nếu các luồng của bạn đang thực hiện bất kỳ loại công việc đòi hỏi nhiều tài nguyên (CPU / Đĩa) thì bạn sẽ hiếm khi thấy lợi ích vượt quá một hoặc hai và quá nhiều sẽ giết chết hiệu suất rất nhanh.

'Trường hợp tốt nhất' là các chủ đề sau này của bạn sẽ bị đình trệ trong khi các chủ đề đầu tiên hoàn thành hoặc một số sẽ có các khối chi phí thấp trên các tài nguyên với sự tranh chấp thấp. Trường hợp xấu nhất là bạn bắt đầu đập bộ đệm / đĩa / mạng và thông lượng tổng thể của bạn giảm xuống sàn.

Một giải pháp tốt là đặt các yêu cầu trong một nhóm sau đó được gửi đến các luồng công nhân từ một nhóm luồng (và vâng, tránh việc tạo / hủy luồng liên tục là bước đầu tiên tuyệt vời).

Số lượng luồng hoạt động trong nhóm này sau đó có thể được điều chỉnh và thu nhỏ dựa trên những phát hiện về hồ sơ của bạn, phần cứng bạn đang chạy và những thứ khác có thể xảy ra trên máy.


Có, và nó nên được sử dụng cùng với hàng đợi hoặc nhóm yêu cầu.
Andrew Grant

2
@Andrew: Tại sao? Nó sẽ thêm một tác vụ vào nhóm luồng mỗi khi nhận được yêu cầu. Tùy thuộc vào nhóm luồng để phân bổ một luồng cho tác vụ khi có sẵn một luồng.
GEOCHET

Vậy bạn sẽ làm gì khi có hàng trăm yêu cầu đến và hết luồng? Tạo thêm? Khối? Trả lại một lỗi? Đặt các yêu cầu của bạn trong một nhóm có thể lớn đến mức cần thiết, sau đó đưa các yêu cầu được xếp hàng này vào nhóm luồng của bạn khi các luồng trở nên miễn phí.
Andrew Grant

"một số luồng được tạo để thực hiện một số tác vụ, thường được tổ chức trong hàng đợi. Thông thường, có nhiều tác vụ hơn luồng. Ngay khi một luồng hoàn thành nhiệm vụ, nó sẽ yêu cầu tác vụ tiếp theo từ hàng đợi cho đến khi tất cả các nhiệm vụ đã được hoàn thành. "
GEOCHET

@Andrew: Tôi không chắc OP đang sử dụng luồng python nào, nhưng nếu bạn muốn có một ví dụ thực tế về chức năng này, tôi đang mô tả: msdn.microsoft.com/en-us/l
Library / trộm

10

Một điều bạn nên nhớ là python (ít nhất là phiên bản dựa trên C) sử dụng cái được gọi là khóa phiên dịch toàn cầu có thể ảnh hưởng rất lớn đến hiệu suất trên các máy đa lõi.

Nếu bạn thực sự cần nhiều nhất về con trăn đa luồng, bạn có thể muốn xem xét sử dụng Jython hoặc một cái gì đó.


4
Sau khi đọc nó, tôi đã thử chạy sàng các tác vụ Eratosthenes trên ba luồng. Chắc chắn, nó thực sự chậm hơn 50% so với việc chạy các tác vụ tương tự trong một luồng. Cảm ơn cho những người đứng đầu lên. Tôi đã chạy Eclipse Pydev trên một máy ảo được phân bổ hai CPU. Tiếp theo, tôi sẽ thử một kịch bản liên quan đến một số cuộc gọi cơ sở dữ liệu.
Don Kirkby

3
Có hai loại (ít nhất) các loại tác vụ: CPU bị ràng buộc (ví dụ: xử lý hình ảnh) và ràng buộc I / O (ví dụ: tải xuống từ mạng). Rõ ràng, "vấn đề" của GIL sẽ không ảnh hưởng quá nhiều đến các nhiệm vụ bị ràng buộc I / O. Nếu các tác vụ của bạn bị ràng buộc CPU thì bạn nên xem xét đa xử lý thay vì đa luồng.
iutinvg

1
vâng, luồng python đã được cải thiện nếu bạn có nhiều mạng io. Tôi thay đổi nó thành luồng và nhanh hơn 10 * so với mã thông thường ...
tyan

8

Như Pax đã nói đúng, đo lường, đừng đoán . Đó là những gì tôi đã làm cho DNSwitness và kết quả thật đáng kinh ngạc: số lượng chủ đề lý tưởng cao hơn nhiều so với tôi nghĩ, khoảng 15.000 chủ đề để có kết quả nhanh nhất.

Tất nhiên, nó phụ thuộc vào nhiều thứ, đó là lý do tại sao bạn phải tự đo lường.

Các biện pháp hoàn chỉnh (chỉ bằng tiếng Pháp) trong Combien de fils d'exécutions? .


1
15.000? Đó là một chút cao hơn tôi mong đợi là tốt. Tuy nhiên, nếu đó là những gì bạn có, thì đó là những gì bạn có, tôi không thể tranh luận với điều đó.
paxdiablo

2
Đối với ứng dụng cụ thể này, hầu hết các luồng chỉ chờ phản hồi từ máy chủ DNS. Vì vậy, càng nhiều song song, tốt hơn, trong thời gian đồng hồ treo tường.
bortzmeyer

18
Tôi nghĩ rằng nếu bạn có 15000 luồng đang chặn trên một số I / O bên ngoài thì một giải pháp tốt hơn sẽ là số lượng luồng ít hơn nhưng với một mô hình không đồng bộ. Tôi nói từ kinh nghiệm ở đây.
Steve

5

Tôi đã viết một số ứng dụng đa luồng. Tôi thường cho phép số lượng chủ đề tiềm năng được chỉ định bởi một tệp cấu hình. Khi tôi điều chỉnh cho các khách hàng cụ thể, tôi đã đặt số lượng đủ cao để mức độ sử dụng tất cả các lõi CPU của tôi khá cao, nhưng không cao đến mức tôi gặp phải các vấn đề về bộ nhớ (đây là các hệ điều hành 32 bit tại thời gian).

Nói cách khác, một khi bạn gặp phải một số tắc nghẽn có thể là CPU, thông lượng cơ sở dữ liệu, thông lượng đĩa, v.v., việc thêm nhiều luồng sẽ không làm tăng hiệu suất tổng thể. Nhưng cho đến khi bạn đạt được điểm đó, thêm chủ đề!

Lưu ý rằng điều này giả định (các) hệ thống được đề cập là dành riêng cho ứng dụng của bạn và bạn không phải chơi độc đáo (tránh bỏ đói) các ứng dụng khác.


1
Bạn có thể đề cập đến một số con số bạn đã thấy cho số lượng chủ đề? Nó sẽ hữu ích để có được ý nghĩa của nó. Cảm ơn.
kovac

3

Câu trả lời "cục sắt lớn" nói chung là một luồng cho mỗi tài nguyên giới hạn - bộ xử lý (bị ràng buộc CPU), nhánh (ràng buộc I / O), v.v. - nhưng chỉ hoạt động nếu bạn có thể định tuyến công việc đến đúng luồng cho tài nguyên được truy cập.

Nếu điều đó là không thể, hãy xem xét rằng bạn có tài nguyên có thể bị nhiễm (CPU) và tài nguyên không bị nhiễm nấm (vũ khí). Đối với CPU, việc gán từng luồng cho một CPU cụ thể là không quan trọng (mặc dù nó giúp quản lý bộ đệm), nhưng đối với vũ khí, nếu bạn không thể gán một luồng cho cánh tay, bạn sẽ vào lý thuyết xếp hàng và số tối ưu để giữ vũ khí bận. Nói chung, tôi nghĩ rằng nếu bạn không thể định tuyến các yêu cầu dựa trên cánh tay được sử dụng, thì có 2-3 luồng trên mỗi cánh tay sẽ là điều đúng đắn.

Một sự phức tạp xảy ra khi đơn vị công việc được chuyển đến luồng không thực hiện một đơn vị công việc nguyên tử hợp lý. Ví dụ, bạn có thể có luồng tại một điểm truy cập vào đĩa, tại một điểm khác chờ trên mạng. Điều này làm tăng số lượng "vết nứt" nơi các luồng bổ sung có thể xâm nhập và thực hiện công việc hữu ích, nhưng nó cũng làm tăng cơ hội cho các luồng bổ sung gây ô nhiễm cho bộ nhớ cache của nhau, v.v. và làm hỏng hệ thống.

Tất nhiên, bạn phải cân nhắc tất cả điều này với "trọng lượng" của một sợi. Thật không may, hầu hết các hệ thống đều có các luồng rất nặng (và cái mà chúng gọi là "các luồng nhẹ" thường không phải là các luồng), vì vậy tốt hơn là nên sai ở phía thấp.

Những gì tôi đã thấy trong thực tế là sự khác biệt rất tinh tế có thể tạo ra sự khác biệt to lớn trong việc có bao nhiêu chủ đề là tối ưu. Cụ thể, các vấn đề về bộ đệm và xung đột khóa có thể hạn chế rất nhiều lượng đồng thời thực tế.


2

Một điều cần xem xét là có bao nhiêu lõi tồn tại trên máy sẽ thực thi mã. Điều đó thể hiện giới hạn cứng về số lượng luồng có thể được tiến hành tại bất kỳ thời điểm nào. Tuy nhiên, nếu trong trường hợp của bạn, các luồng được dự kiến ​​sẽ thường xuyên chờ cơ sở dữ liệu thực hiện truy vấn, bạn có thể muốn điều chỉnh các luồng của mình dựa trên số lượng truy vấn đồng thời mà cơ sở dữ liệu có thể xử lý.


2
À, không. Toàn bộ vấn đề của các luồng là (trước khi đa lõi và nhiều bộ xử lý trở nên phổ biến) là có thể bắt chước có nhiều bộ xử lý trên một máy chỉ có một. Đó là cách bạn có được giao diện người dùng đáp ứng - một luồng chính và các luồng phụ trợ.
mmr

1
@mmr: Ừm. Ý tưởng của các luồng là cho phép chặn I / O và các tác vụ khác.
GEOCHET

4
Tuyên bố tôi đã đưa ra là số lượng lõi trên máy thể hiện giới hạn cứng đối với số lượng luồng có thể thực hiện công việc tại một thời điểm nhất định, đó là một thực tế. Tất nhiên các luồng khác có thể chờ các hoạt động I / O hoàn thành và đối với câu hỏi này là một sự cân nhắc quan trọng.
newdayrising

1
Dù sao đi nữa - bạn có GIL trong Python, điều này làm cho các luồng chỉ song song về mặt lý thuyết. Không có nhiều hơn 1 luồng có thể chạy đồng thời, do đó, chỉ có các hoạt động phản hồi và chặn hoạt động mới là vấn đề.
Abgan

2
+1 Để thực sự hiểu cách thức máy tính hoạt động. @mmr: Bạn cần hiểu sự khác biệt giữa dường như có nhiều bộ xử lý và có nhiều bộ xử lý. @Rich B: Nhóm luồng chỉ là một trong nhiều cách để xử lý tập hợp các luồng. Đó là một trong những tốt, nhưng chắc chắn không phải là người duy nhất.
đau buồn

2

Tôi nghĩ rằng đây là một chút né tránh câu hỏi của bạn, nhưng tại sao không chia chúng thành các quy trình? Sự hiểu biết của tôi về kết nối mạng (từ những ngày mờ ám, tôi hoàn toàn không mã mạng) là mỗi kết nối đến có thể được xử lý như một quy trình riêng biệt, bởi vì nếu ai đó làm điều gì đó khó chịu trong quy trình của bạn, thì không nuke toàn bộ chương trình.


1
Đối với Python điều đó đặc biệt đúng, vì nhiều quy trình có thể chạy song song, trong khi nhiều luồng - thì không. Chi phí tuy nhiên khá cao. Bạn phải khởi động trình thông dịch Python mới mỗi lần và kết nối với DB với mỗi quy trình (hoặc sử dụng một số chuyển hướng ống, nhưng nó cũng có giá).
Abgan

Chuyển đổi giữa các quy trình là - hầu hết thời gian - tốn kém hơn so với chuyển đổi giữa các luồng (toàn bộ chuyển đổi ngữ cảnh thay vì một số thanh ghi). Cuối cùng, nó phụ thuộc rất nhiều vào luồng-lib của bạn. Khi các câu hỏi xoay quanh việc phân luồng, tôi cho rằng các quy trình đã hết câu hỏi.
Leonidas

Đủ công bằng. Tuy nhiên, tôi không chắc tại sao tôi lại đạt được -2 điểm, trừ khi mọi người thực sự muốn xem câu trả lời chỉ, thay vì bao gồm các câu trả lời khác hoạt động.
mmr

@mmr: Xem xét câu hỏi là về / chủ đề / nhóm, vâng, tôi nghĩ mọi người nên mong đợi một câu trả lời về chủ đề.
GEOCHET

Quá trình tạo có thể được thực hiện một lần khi khởi động (nghĩa là nhóm quy trình thay vì nhóm luồng). Khấu hao trong thời gian áp dụng, điều này có thể nhỏ. Họ không thể chia sẻ thông tin một cách dễ dàng nhưng họ KHÔNG mua cho họ khả năng chạy trên nhiều CPU nên câu trả lời này rất hữu ích. +1.
paxdiablo

1

ryeguy, tôi hiện đang phát triển một ứng dụng tương tự và số chủ đề của tôi được đặt thành 15. Thật không may nếu tôi tăng nó ở mức 20 thì nó bị hỏng. Vì vậy, vâng, tôi nghĩ cách tốt nhất để xử lý việc này là đo xem cấu hình hiện tại của bạn có cho phép nhiều hay ít hơn một số X của các luồng hay không.


5
Thêm vào số lượng chủ đề của bạn không nên ngẫu nhiên sụp đổ ứng dụng của bạn. Có một số lý do. Bạn sẽ làm tốt để tìm ra nguyên nhân bởi vì nó có thể ảnh hưởng đến bạn ngay cả với ít chủ đề hơn trong một số trường hợp, ai biết được.
Matthew Lund

-6

Trong hầu hết các trường hợp, bạn nên cho phép nhóm luồng xử lý việc này. Nếu bạn đăng một số mã hoặc cung cấp thêm chi tiết, có thể dễ dàng hơn để xem liệu có lý do nào đó hành vi mặc định của nhóm luồng sẽ không tốt nhất.

Bạn có thể tìm thêm thông tin về cách thức hoạt động của nó ở đây: http://en.wikipedia.org/wiki/Thread_pool_potype


1
@Pax: Đây không phải là lần đầu tiên đa số mọi người không muốn trả lời câu hỏi (hoặc hiểu nó). Tôi không lo lắng.
GEOCHET

-10

Nhiều luồng như lõi CPU là những gì tôi đã nghe rất thường xuyên.


5
@Rich, ít nhất là giải thích tại sao :-). Quy tắc này chỉ áp dụng khi tất cả các luồng được gắn kết với CPU; họ nhận được một 'CPU' mỗi cái. Khi nhiều luồng bị ràng buộc I / O, thường có nhiều luồng hơn so với 'CPU (CPU được trích dẫn vì nó áp dụng cho các luồng thực thi vật lý, ví dụ như lõi).
paxdiablo

1
@Abgan, tôi không chắc về điều đó, nghĩ rằng có lẽ Python sẽ tạo ra các luồng hệ điều hành "thực" (chạy trên nhiều CPU). Nếu những gì bạn nói là đúng (tôi không có lý do để nghi ngờ), thì số lượng CPU không có mang - luồng chỉ hữu ích khi hầu hết các luồng đang chờ một cái gì đó (ví dụ DB I / O).
paxdiablo

1
@Rich: khi phân luồng (thực), số lượng CPU KHÔNG mang vì bạn có thể chạy nhiều luồng không chờ thực sự đồng thời. Với một CPU, chỉ có một lần chạy và lợi ích tích lũy từ việc có nhiều luồng khác đang chờ tài nguyên không phải CPU.
paxdiablo

1
@Pax: Bạn không hiểu khái niệm nhóm luồng thì tôi đoán vậy.
GEOCHET

1
@Rich, tôi hiểu chủ đề tốt; có vẻ như tôi (và những người khác ở đây) cũng hiểu phần cứng tốt hơn bạn. Với một CPU, chỉ một luồng thực thi có thể chạy, ngay cả khi có các luồng khác đang chờ CPU. Hai CPU, hai có thể chạy. Nếu tất cả các luồng đang chờ CPU, số luồng lý tưởng bằng ...
paxdiablo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.