Hướng dẫn python is single threaded or multithreaded - python là đơn luồng hoặc đa luồng

Tôi đã đọc cách Clojure là 'mát mẻ' vì cú pháp của nó + nó chạy trên JVM để nó được đa luồng, v.v.

Có phải các ngôn ngữ như Ruby và Python duy nhất có trong tự nhiên? (Khi chạy như một ứng dụng web).

Sự khác biệt cơ bản giữa Python/Ruby và Java đang chạy trên Tomcat là gì?

Không phải máy chủ web có một nhóm các luồng để làm việc trong mọi trường hợp?

Omar Qureshi

8.8533 huy hiệu vàng32 Huy hiệu bạc35 Huy hiệu đồng3 gold badges32 silver badges35 bronze badges

Đã hỏi ngày 21 tháng 6 năm 2010 lúc 16:29Jun 21, 2010 at 16:29

Hướng dẫn python is single threaded or multithreaded - python là đơn luồng hoặc đa luồng

BlankmanblankmanBlankman

253K315 Huy hiệu vàng747 Huy hiệu bạc1172 Huy hiệu đồng315 gold badges747 silver badges1172 bronze badges

4

Cả Python và Ruby đều có hỗ trợ đầy đủ cho đa luồng. Có một số triển khai (ví dụ: Cpython, MRI, YARV) thực sự không thể chạy các luồng song song, nhưng đó là một hạn chế của các triển khai cụ thể đó, chứ không phải ngôn ngữ. Điều này tương tự như Java, trong đó cũng có một số triển khai không thể chạy song song, nhưng điều đó không có nghĩa là Java là một luồng đơn.

Lưu ý rằng trong cả hai trường hợp, có rất nhiều triển khai có thể chạy các luồng song song: Pypy, Ironpython, Jython, Ironruby và Jruby chỉ là một vài trong số các ví dụ.

Sự khác biệt chính giữa Clojure ở một bên và Python, Ruby, Java, C#, C ++, C, PHP và khá nhiều ngôn ngữ chính thống và không chính thống khác ở phía bên kia là Clojure có mô hình đồng thời lành mạnh. Tất cả các ngôn ngữ khác sử dụng các chủ đề, mà chúng ta đã biết là một mô hình đồng thời xấu trong ít nhất 40 năm. Clojure OTOH có mô hình cập nhật lành mạnh cho phép nó không chỉ trình bày một mô hình đồng thời mà thực sự là nhiều mô hình đồng thời cho người lập trình viên: cập nhật nguyên tử, bộ nhớ giao dịch phần mềm, các tác nhân không đồng bộ Và trong tương lai có thể thậm chí nhiều hơn.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:43Jun 21, 2010 at 16:43

Jörg W Mittagjörg W MittagJörg W Mittag

356K75 Huy hiệu vàng430 Huy hiệu bạc636 Huy hiệu Đồng75 gold badges430 silver badges636 bronze badges

7

Một câu hỏi bối rối với rất nhiều câu trả lời bối rối ...

Đầu tiên, thực hiện luồng và thực hiện đồng thời là những điều khác nhau. Python hỗ trợ chủ đề tốt; Nó không hỗ trợ thực hiện đồng thời trong bất kỳ triển khai trong thế giới thực. .

Thứ hai, điều này là không liên quan cho các ứng dụng web. Bạn không cần Python phụ trợ để thực hiện đồng thời trong cùng một quy trình. Bạn sinh ra các quy trình riêng biệt cho mỗi phụ trợ, sau đó mỗi yêu cầu xử lý song song vì chúng hoàn toàn không được gắn với nhau.

Sử dụng các chủ đề cho phụ trợ web là một ý tưởng tồi. Tại sao lại giới thiệu những nguy cơ của luồng-khóa, điều kiện chủng tộc, bế tắc-với một cái gì đó vốn có một cách xấu hổ song song? Sẽ an toàn hơn nhiều khi nhét từng phụ trợ trong quá trình bị cô lập của riêng mình, tránh tiềm năng cho tất cả những vấn đề này.

(Có những lợi thế để chia sẻ không gian bộ nhớ-nó lưu bộ nhớ, bằng cách chia sẻ mã tĩnh-nhưng có thể được giải quyết mà không cần chủ đề.)

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 22:08Jun 21, 2010 at 22:08

Glenn Maynardglenn MaynardGlenn Maynard

54.4K10 Huy hiệu vàng117 Huy hiệu bạc131 Huy hiệu đồng10 gold badges117 silver badges131 bronze badges

6

CPython có khóa phiên dịch toàn cầu có thể làm giảm hiệu suất của mã đa luồng trong Python. Hiệu ứng ròng, trong một số trường hợp, là các luồng thực sự không thể chạy đồng thời vì khóa tranh chấp. Không phải tất cả các triển khai Python đều sử dụng GIL vì vậy điều này có thể không áp dụng cho JPython, Ironpython hoặc các triển khai khác.

Ngôn ngữ tự nó hỗ trợ luồng và các hoạt động không đồng bộ khác. Các thư viện Python cũng có thể hỗ trợ luồng bên trong mà không cần đưa nó trực tiếp với trình thông dịch Python.

Nếu bạn đã nghe bất cứ điều gì tiêu cực về Python và luồng (hoặc nó không hỗ trợ nó), thì có lẽ ai đó gặp phải tình huống mà Gil đang gây ra một nút cổ chai ..

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:45Jun 21, 2010 at 16:45

James Schekjames SchekJames Schek

17.7K7 Huy hiệu vàng 50 Huy hiệu bạc64 Huy hiệu đồng7 gold badges50 silver badges64 bronze badges

0

Chắc chắn máy chủ web sẽ có một nhóm các chủ đề. Đó chỉ nằm ngoài sự kiểm soát của chương trình của bạn. Những luồng đó được sử dụng để xử lý các yêu cầu HTTP. Mỗi yêu cầu HTTP được xử lý trong một luồng riêng biệt và luồng được phát hành trở lại nhóm khi phản hồi HTTP được liên kết kết thúc. Nếu máy chủ web không có một nhóm như vậy, nó sẽ cực kỳ chậm trong việc phục vụ.

Việc một ngôn ngữ lập trình có được SingLethreaded hay MultiDreaded phụ thuộc vào khả năng đưa ra các chủ đề mới được lập trình bằng ngôn ngữ được đề cập. Nếu điều đó là không thể, thì ngôn ngữ này được phân phối, ví dụ PHP. Theo như tôi có thể thấy, cả Ruby và Python đều hỗ trợ đa luồng.new threads using the language in question. If that isn't possible, then the language is singlethreaded, for example PHP. As far as I can see, both Ruby and Python supports multithreading.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:35Jun 21, 2010 at 16:35

BaluscbaluscBalusC

1.1M366 Huy hiệu vàng3575 Huy hiệu bạc3525 Huy hiệu đồng366 gold badges3575 silver badges3525 bronze badges

2

Câu trả lời ngắn gọn là có, chúng là một luồng.

Câu trả lời dài là nó phụ thuộc.

Jruby là đa luồng và có thể được chạy trong tomcat như mã Java khác. MRI (mặc định Ruby) và Python đều có Gil (Khóa phiên dịch toàn cầu) và do đó được xâu chuỗi.

Cách nó hoạt động cho các máy chủ web còn phức tạp hơn bởi số lượng cấu hình máy chủ có sẵn. Đối với hầu hết các ứng dụng Ruby, có (ít nhất) hai cấp độ của máy chủ, máy chủ tệp proxy/tĩnh như nginx và sau đó là máy chủ ứng dụng Ruby.

Nginx không sử dụng các chủ đề như Apache hoặc Tomcat, nó sử dụng các sự kiện không chặn (và tôi nghĩ các quy trình công nhân nĩa). Điều này cho phép nó đối phó với mức độ đồng thời cao hơn so với được phép với chi phí và lịch trình không hiệu quả của các chủ đề gốc.

Các máy chủ ứng dụng Ruby khác nhau cũng hoạt động theo các cách khác nhau để có được thông lượng cao và đồng thời mà không cần luồng. Thin sử dụng libev và mô hình sự kiện không đồng bộ như nginx. Mongrel sử dụng một nhóm quy trình công nhân vòng tròn. Unicorn sử dụng UNIX IPC gốc (chọn trên ổ cắm) để tải cân bằng vào một nhóm quy trình nĩa thông qua một ổ cắm proxy chính.

Chủ đề chỉ là một cách để giải quyết đồng thời. Nhiều quy trình và mô hình được tổ chức là một cách tiếp cận khác nhau liên kết tốt với cơ sở UNIX. Điều này về cơ bản khác với cách Java đối xử với thế giới.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:43Jun 21, 2010 at 16:43

4

Python

Hãy để tôi cố gắng đặt nó đơn giản hơn các câu trả lời chi tiết hơn.

Trái tim của câu trả lời ở đây không thực sự phải làm với Python là một luồng đơn so với nhiều luồng. Nó có liên quan nhiều hơn đến việc xâu chuỗi so với đa xử lý.

Nói Python là "một luồng đơn" không thực sự nắm bắt thực tế, bởi vì bạn chắc chắn có thể có nhiều hơn một luồng chạy trong một quy trình Python. Chỉ cần sử dụng thư viện luồng và tạo nhiều hơn một luồng. Ở đó, bây giờ bạn vừa chứng minh rằng Python không được đọc đơn.

Nhưng sử dụng nhiều luồng trong Python không có nghĩa là bạn đang sử dụng nhiều bộ xử lý CPU đồng thời. Trong thực tế, khóa phiên dịch toàn cầu ngăn chặn điều này. Vì vậy, đây là nơi có câu hỏi phát sinh.

Về cơ bản, việc xâu chuỗi trong Python không thể được sử dụng để tính toán CPU song song. Nhưng bạn có thể thực hiện tính toán CPU song song với Python bằng cách sử dụng đa xử lý thay vì đa luồng.

Tôi thấy bài viết này rất hữu ích khi nghiên cứu điều này: https://timber.io/blog/multiprocessing-vs-multithreading-in-python-what-you-meed-to-know/. Nó bao gồm các ví dụ trong thế giới thực khi bạn muốn sử dụng đa xử lý so với đa luồng.

Đã trả lời ngày 1 tháng 3 năm 2019 lúc 18:59Mar 1, 2019 at 18:59

Mark_ioMark_ioMark_io

811 Huy hiệu bạc4 Huy hiệu đồng1 silver badge4 bronze badges

Hầu hết các ngôn ngữ không định nghĩa đơn hoặc đa luồng. Thông thường, điều đó được để lại cho các thư viện để thực hiện.

Điều đó đang được nói, một số ngôn ngữ tốt hơn những ngôn ngữ khác. Chẳng hạn, Cpython có vấn đề với việc khóa trình thông dịch trong quá trình đọc, Jython (Python chạy trên JVM) thì không.

Một số sức mạnh thực sự của Clojure (IMO) là nó chạy trên JVM. Bạn nhận được nhiều luồng và hàng tấn thư viện miễn phí.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:40Jun 21, 2010 at 16:40

Ablermanablermanablerman

1.5231 Huy hiệu vàng12 Huy hiệu bạc20 Huy hiệu Đồng1 gold badge12 silver badges20 bronze badges

3

Một vài ngôn ngữ lập trình được giải thích như chuỗi hỗ trợ CPython và Ruby, nhưng có một giới hạn được gọi là khóa phiên dịch toàn cầu (GIL). GIL là khóa loại trừ lẫn nhau được tổ chức bởi trình thông dịch ngăn chặn trình thông dịch diễn giải đồng thời mã ứng dụng trên hai hoặc nhiều luồng cùng một lúc, điều này hạn chế hiệu quả sự đồng thời trên nhiều hệ thống lõi.

từ chủ đề Wikipedia

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:46Jun 21, 2010 at 16:46

tkrtkrtkr

1.3211 huy hiệu vàng9 Huy hiệu bạc27 Huy hiệu đồng1 gold badge9 silver badges27 bronze badges

1

Giữ điều này rất ngắn ..

Python hỗ trợ đa luồng.

Python không hỗ trợ thực hiện song song các chủ đề của nó.does NOT support parallel execution of its Threads.


Exception:

Tuyên bố trên có thể thay đổi theo việc triển khai Python không sử dụng Gil (khóa phiên dịch toàn cầu).

Nếu một triển khai cụ thể không sử dụng Gil, thì đó sẽ là đa luồng cũng như hỗ trợ thực thi song song

Đã trả lời ngày 12 tháng 2 năm 2020 lúc 5:21Feb 12, 2020 at 5:21

Hướng dẫn python is single threaded or multithreaded - python là đơn luồng hoặc đa luồng

Aditya rewariaditya rewariAditya Rewari

2.0731 Huy hiệu vàng17 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge17 silver badges30 bronze badges

3

Ruby

Trình thông dịch Ruby là một luồng, có nghĩa là một số phương thức của nó không an toàn.

Trong thế giới Rails, chủ đề đơn này hầu hết đã được đẩy đến máy chủ. Vì vậy, bạn sẽ thấy Nginx chạy với một nhóm máy chủ Mongrel, mỗi máy chủ có trình thông dịch trong bộ nhớ, xử lý 1 yêu cầu tại một thời điểm và trong chính chủ đề của nó.

Hành khách, chạy "Ruby Enterprise" mang lại khái niệm về bộ sưu tập rác và một số an toàn chủ đề vào đường ray, và thật tuyệt.

Vẫn còn làm việc trong đường ray trên khu vực này, nhưng nó đang đến từ từ - nhưng nói chung, ý tưởng là có nhiều dịch vụ và máy chủ.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:40Jun 21, 2010 at 16:40

Jesse Wolgamottjesse WolgamottJesse Wolgamott

40.1k4 Huy hiệu vàng82 Huy hiệu bạc108 Huy hiệu đồng4 gold badges82 silver badges108 bronze badges

3

Làm thế nào để gỡ rối các nút thắt trong các chủ đề đó ...

Clojure không phát minh ra luồng, tuy nhiên nó có sự hỗ trợ đặc biệt mạnh mẽ cho nó với bộ nhớ giao dịch phần mềm, nguyên tử, tác nhân, hoạt động bản đồ song song, ...

Tất cả những người khác đã tích lũy hỗ trợ luồng. Ruby là một trường hợp đặc biệt vì nó có các luồng màu xanh lá cây trong một số triển khai là một loại chủ đề được mô phỏng phần mềm và không sử dụng tất cả các lõi. 1.9 sẽ đặt điều này để nghỉ ngơi.

Về các máy chủ web, không có chúng không phải lúc nào cũng hoạt động nhiều luồng, Apache theo truyền thống đã chạy như một đàn daemon là một nhóm các quy trình duy nhất riêng biệt. Bây giờ có nhiều tùy chọn hơn để chạy các máy chủ Apache.

Để tóm tắt tất cả các ngôn ngữ hiện đại hỗ trợ luồng ở dạng này hay dạng khác.

Các ngôn ngữ mới hơn như Scala và Clojure đang thêm hỗ trợ cụ thể để cải thiện công việc với nhiều luồng mà không khóa rõ ràng vì điều này theo truyền thống là cạm bẫy lớn của đa luồng.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 16:42Jun 21, 2010 at 16:42

Peter Tillemanspeter TillemansPeter Tillemans

34.6K10 Huy hiệu vàng80 Huy hiệu bạc113 Huy hiệu đồng10 gold badges80 silver badges113 bronze badges

Đọc những câu trả lời này ở đây ... rất nhiều người trong số họ cố gắng nghe thông minh hơn so với thực sự là IMHO (tôi chủ yếu nói về những thứ liên quan đến Ruby vì đó là một thứ tôi quen thuộc nhất). Trên thực tế, Jruby hiện là triển khai Ruby duy nhất hỗ trợ sự đồng thời thực sự. Trên các chủ đề Ruby JVM được ánh xạ tới các luồng gốc của HĐH, mà không gây cản trở Gil. Vì vậy, hoàn toàn chính xác để nói rằng Ruby không phải là đa luồng. Trong 1.8.x Ruby thực sự được chạy bên trong một luồng hệ điều hành và trong khi bạn có cảm giác đồng thời giả với các chủ đề màu xanh lá cây, thì trong thực tế, Gil sẽ ngăn bạn không có sự đồng thời thực sự. Trong Ruby 1.9, điều này đã thay đổi một chút, vì bây giờ một quá trình Ruby có thể có nhiều luồng hệ điều hành được gắn vào nó (cộng với các luồng màu xanh lá cây), nhưng một lần nữa Gil sẽ phá hủy hoàn toàn điểm và trở thành nút cổ chai.

Trong thực tế, từ quan điểm web của ứng dụng web thông thường, sẽ không quan trọng nhiều nếu nó đơn hoặc đa luồng. Dù sao thì vấn đề chủ yếu phát sinh ở phía máy chủ và nó chủ yếu là vấn đề khác biệt về kỹ thuật mở rộng.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 17:28Jun 21, 2010 at 17:28

Hướng dẫn python is single threaded or multithreaded - python là đơn luồng hoặc đa luồng

9

Có Ruby và Python có thể xử lý nhiều luồng, nhưng đối với nhiều trường hợp (Web) sẽ tốt hơn để dựa vào các luồng được tạo bởi các yêu cầu HTTP từ máy khách đến máy chủ. Ngay cả khi bạn tạo ra nhiều luồng trên cùng một ứng dụng để giảm chi phí thời gian chạy hoặc để xử lý nhiều nhiệm vụ tại thời điểm, trong trường hợp ứng dụng web thường có quá nhiều thời gian Ứng dụng của bạn trong một trang duy nhất, nên sử dụng các kỹ thuật AJAX (JavaScript và XML không đồng bộ) khôn ngoan hơn: Đảm bảo thiết kế web của bạn hiển thị nhanh chóng và đưa ra sự không đồng bộ với những thứ mã hóa cứng đó sau này.

Điều đó không có nghĩa là đa luồng là vô dụng đối với Web! Rất khuyến khích tính phí máy chủ của bạn nếu bạn muốn chạy các ứng dụng-applcore-applcore-applcore phức tạp (không phải cho một trang web Phục vụ bởi một phản ứng HTTP.

Đã trả lời ngày 21 tháng 6 năm 2010 lúc 19:48Jun 21, 2010 at 19:48

Python có thể đa không

Python không hỗ trợ đa luồng vì Python trên trình thông dịch Cpython không hỗ trợ thực thi đa lõi thực sự thông qua đa luồng.Tuy nhiên, Python có một thư viện luồng.Gil không ngăn chặn luồng. because Python on the Cpython interpreter does not support true multi-core execution via multithreading. However, Python does have a threading library. The GIL does not prevent threading.

Python có đa luồng theo mặc định không?

Theo mặc định, đa luồng theo mặc định, các chương trình Python của bạn có một luồng duy nhất, được gọi là luồng chính.Bạn có thể tạo các luồng bằng cách chuyển một hàm cho hàm tạo luồng () hoặc bằng cách kế thừa lớp luồng và ghi đè phương thức Run ().By default, your Python programs have a single thread, called the main thread. You can create threads by passing a function to the Thread() constructor or by inheriting the Thread class and overriding the run() method.