Hướng dẫn python multithreading on a list - python đa luồng trên một danh sách
Bạn có thể tạo một danh sách an toàn chủ đề bằng cách sử dụng khóa loại trừ lẫn nhau (MUTEX) thông qua lớp Threading.lock. thread-safe list by using a mutual exclusion (mutex) lock via the threading.Lock class. Show
Trong hướng dẫn này, bạn sẽ khám phá cách phát triển một danh sách an toàn chủ đề trong Python. Bắt đầu nào.
Cần một danh sách an toàn chủ đềHầu hết các hoạt động danh sách là nguyên tử Hoạt động danh sách nguyên tử rất dễ vỡ Cách phát triển danh sách an toàn chủ đề Ví dụ về danh sách an toàn chủ đềthreading.Thread class. Thay thế cho một danh sách an toàn chủ đề
Đọc thêm Takeaways Một chủ đề là một chủ đề thực thi trong một chương trình máy tính. Hầu hết các hoạt động danh sách là nguyên tửHoạt động danh sách nguyên tử rất dễ vỡ Cách phát triển danh sách an toàn chủ đềList class. Ví dụ về danh sách an toàn chủ đề Thay thế cho một danh sách an toàn chủ đề
Specifically:
Chủ đề trong Python: Hướng dẫn hoàn chỉnh
Nhiều luồng có thể cần nối dữ liệu vào cùng một danh sách, các luồng khác có thể muốn xóa các mục hoặc kiểm tra độ dài của danh sách. Là danh sách an toàn trong Python và nếu không, làm thế nào chúng ta có thể làm cho nó an toàn? Nhiều hoạt động phổ biến trong danh sách là nguyên tử, có nghĩa là chúng an toàn cho luồng. Nhớ lại, một danh sách là một ví dụ của lớp danh sách. Hoạt động danh sách nguyên tử rất dễ vỡCách phát triển danh sách an toàn chủ đề Ví dụ về danh sách an toàn chủ đề
Takeaways Một chủ đề là một chủ đề thực thi trong một chương trình máy tính. Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời. Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng.
Takeaways Một chủ đề là một chủ đề thực thi trong một chương trình máy tính. Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời. Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng. Cách phát triển danh sách an toàn chủ đềVí dụ về danh sách an toàn chủ đề Thay thế cho một danh sách an toàn chủ đề Ví dụ về việc sử dụng hàng đợi an toàn chủ đề Một thể hiện của luồng.lock có thể được sử dụng để bảo vệ danh sách.threading.Lock can be used to protect the list. Bạn có thể tìm hiểu thêm về khóa Mutex ở đây:
Khóa này phải được mua trước khi hoạt động trong danh sách và được phát hành khi hoạt động trong danh sách đã hoàn thành. Ví dụ:
# hoạt động trong danh sách # Phát hành khóa Ví dụ:
# có được khóa # hoạt động trong danh sách # Phát hành khóathreading.RLock class. It will allow the lock to be acquired by the same thread again. Điều này đảm bảo rằng chỉ có một luồng tại một thời điểm có thể hoạt động trong danh sách.
với khóa: Điều này thêm chi phí, làm cho mỗi hoạt động danh sách chậm hơn nhiều so với nếu không có khóa. Lợi ích là niềm tin rằng các điều kiện chủng tộc với danh sách đã được loại bỏ hoàn toàn.List class and implement thread-safe versions of all or a subset of functions. Nếu thiết kế của bạn là có một số chức năng được bọc, hãy gọi các chức năng được bọc khác, thì khóa reentrant được ưa thích, để tránh bế tắc.List class, except the functions on the class are threads-safe. Điều này có thể đạt được thông qua lớp Threading.Rlock. Nó sẽ cho phép khóa được thu được bởi cùng một luồng một lần nữa.List class. Bạn có thể tìm hiểu thêm về khóa reentrant ở đây:List that is thread safe, it is a data structure designed for a thread-safe use case that must be treated with extreme care. Cách sử dụng khóa Reentrant trong PythonThreadSafeList.
Một cách tiếp cận khác là xác định một lớp mới có cùng giao diện với lớp Danh sách, ngoại trừ các chức năng trên lớp là an toàn cho luồng.
# ... Tiếp theo, chúng ta có thể xác định một hàm tạo khởi tạo cả danh sách nội bộ và khóa được sử dụng để bảo vệ danh sách dưới dạng các biến thể hiện trên lớp.
Tiếp theo, chúng ta có thể bắt đầu thêm chức năng mà chúng ta có thể cần trong ứng dụng của mình. Trong trường hợp này, chúng tôi sẽ cung cấp bốn hoạt động trong danh sách: Thêm một giá trị thông qua append ().
Ví dụ: phương pháp cho hoạt động phụ lục được liệt kê dưới đây.
Giao diện trình quản lý bối cảnh được ưa thích như một hoạt động trong danh sách có thể gây ra lỗi (ví dụ: chỉ mục ra khỏi giới hạn) và chúng tôi cần đảm bảo rằng khóa sẽ luôn được phát hành, bất kể thành công hay thất bại của hoạt động. Ví dụ: phương pháp cho hoạt động phụ lục được liệt kê dưới đây. # Thêm giá trị vào danh sách def expend (tự, giá trị):
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;sort() and extend(). & nbsp; & nbsp; & nbsp; & nbsp;# xóa và trả về giá trị cuối cùng từ danh sáchindex() or reverse(). & nbsp; & nbsp; & nbsp; & nbsp; def pop (self): & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;& nbsp; & nbsp; & nbsp; & nbsp;# đọc một giá trị từ danh sách tại một chỉ mục & nbsp; & nbsp; & nbsp; & nbsp; def get (self, index): & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# Trả về số lượng mục trong danh sách & nbsp; & nbsp; & nbsp; & nbsp; độ dài def (self):ThreadSafeList, then loop 100,000 times, adding a value to the list each iteration. Là một tiện ích mở rộng, hãy thử thêm một số hoạt động bổ sung mà bạn muốn sử dụng trong danh sách của mình như Sort () và Extend ().add_items() function below implements this.
Ví dụ về danh sách an toàn chủ đề
Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3.10) của trình thông dịch Python tham chiếu, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách an toàn chủ đề của chúng tôi được phát triển trong phần trước.add_items() function and be passed the same ThreadSafeList as an argument. Đầu tiên, chúng ta có thể xác định một chức năng được thực thi bởi mỗi luồng công nhân.
Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3.10) của trình thông dịch Python tham chiếu, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách an toàn chủ đề của chúng tôi được phát triển trong phần trước.
Đầu tiên, chúng ta có thể xác định một chức năng được thực thi bởi mỗi luồng công nhân.
Đầu tiên, chúng ta có thể xác định một chức năng được thực thi bởi mỗi luồng công nhân.
Đầu tiên, chúng ta có thể xác định một chức năng được thực thi bởi mỗi luồng công nhân.
& nbsp; & nbsp; & nbsp; & nbsp; độ dài def (self): # Thêm các mục vào danh sách def add_items (an toàn_list): # Tạo danh sách an toàn chủ đềThreadSafeList class might be to add a function so that a thread can get the lock once and add many items to the list in batch. # Định cấu hình các luồng để thêm vào danh sách # Bắt đầu chủ đề Inthreads forthreads:
# Báo cáo số lượng mục trong danh sách in (kích thước f'list: {an toàn_list.length ()} ')Chạy ví dụ đầu tiên tạo ra một thể hiện của danh sách an toàn luồng của chúng tôi, nội bộ xác định một thể hiện danh sách mới và khóa để bảo vệ danh sách. Sau đó, chúng tôi định cấu hình và bắt đầu mười luồng, mỗi chủ đề rất cố gắng thêm 100.000 mục vào danh sách. Mỗi cuộc gọi để nối () trên danh sách an toàn luồng được bảo vệ bởi khóa, đảm bảo rằng chỉ có một luồng có thể thêm một mục vào danh sách tại một thời điểm. Một cải tiến hữu ích cho lớp ThreadSafelist có thể là thêm một hàm để một luồng có thể lấy khóa một lần và thêm nhiều mục vào danh sách theo đợt.queue module, such as the queue.Queue and queue.SimpleQueue classes. Các luồng chính chặn cho đến khi tất cả mười luồng mới chấm dứt.queue.Queue class are designed specifically to be thread-safe in a concurrent programming environment. Cuối cùng, tất cả các chủ đề kết thúc thêm các mục của họ, các luồng chính bỏ chặn và báo cáo độ dài của danh sách.queue.Queue class.
Chúng ta có thể thêm các mục vào hàng đợi theo cách an toàn chủ đề bằng cách sử dụng hàm put ().put() function. Ví dụ:
Chúng ta có thể xóa các mục khỏi hàng đợi theo cách an toàn luồng bằng cách sử dụng hàm get ().get() function. Ví dụ:
Chúng ta có thể xóa các mục khỏi hàng đợi theo cách an toàn luồng bằng cách sử dụng hàm get (). # Nhận mục tiếp theo từ hàng đợi theo cách an toàn chủ đềqueue module and classes. Các lớp hàng đợi này được thiết kế để nhanh chóng, trừu tượng hóa cách cấu trúc được giữ an toàn cho chủ đề trong khi thực hiện theo cách nhanh nhất và phù hợp nhất cho phiên bản Python hiện tại. Chúng ta có thể thấy điều này nếu chúng ta xem lại mã nguồn cho mô -đun hàng đợi và các lớp.put() does not use an internal mutex lock. Như vậy, một số hoạt động được thực hiện trực tiếp, dựa vào bản chất nguyên tử của lớp Danh sách.qsize() function and checking if the queue is full via full() or empty via empty(). Ví dụ: đặt một mục với put () không sử dụng khóa mutex bên trong.threading.Condition objects, allowing threads to wait on getting items from the queue until there are new items or to wait on putting items in the queue until it is not full. These conditions also share the same mutex. Các hoạt động khác liên quan đến tổng hợp các hoạt động trong danh sách được bảo vệ bởi khóa mutex bên trong như kiểm tra kích thước của hàng đợi thông qua hàm qsize () và kiểm tra xem hàng đợi có đầy đủ thông qua đầy đủ () hoặc trống thông qua trống ().get(). Ngoài ra, hàng đợi cung cấp một số khả năng chờ đợi/thông báo thông qua các luồng nội bộ. Đối tượng điều kiện, cho phép các chủ đề chờ đợi các mục từ hàng đợi cho đến khi có các mục mới hoặc chờ đặt các mục vào hàng đợi cho đến khi nó không đầy. Những điều kiện này cũng chia sẻ cùng một mutex. Các hoạt động đầu tiên có được một điều kiện sử dụng cùng một khóa mutex bên trong cũng được bảo vệ. Một ví dụ là nhận các mục từ hàng đợi thông qua get ().Tôi khuyên bạn nên sử dụng một lớp hàng đợi thay vì phát triển lớp danh sách an toàn luồng, nếu nó cung cấp tất cả hoặc hầu hết các chức năng bạn yêu cầu trong ứng dụng của mình.queue.Queue instead of our ThreadSafeList class. Ví dụ về việc sử dụng hàng đợi an toàn chủ đềadd_items() function to call put() to add items on the queue. Chúng tôi có thể cập nhật ví dụ danh sách an toàn chủ đề của mình để sử dụng hàng đợi.queue thay vì lớp ThreadSafelist của chúng tôi.
# Thêm các mục vào danh sáchqueue.Queue.
Sau đó, chúng ta có thể xác định biến an toàn của chúng ta là một ví dụ của hàng đợi.queue.qsize() function on the queue.
# Báo cáo số lượng mục trong danh sách
# Báo cáo số lượng mục trong danh sách in (kích thước f'list: {an toàn_list.qsize ()} ') Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây. # SuperfastPython.com # Ví dụ về danh sách an toàn chủ đề thông qua hàng đợi từ luồng nhập luồngqueue.Queue does not block when adding items - which is the majority of the work performed by the threads in this example.
# Bắt đầu chủ đềInthreads forthreads:
Cuối cùng, các luồng chính bỏ chặn và báo cáo kích thước của hàng đợi.Trong trường hợp này, kích thước được báo cáo là 1.000.000 mặt hàng, như mong đợi. Hơn nữa, bạn sẽ nhận thấy rằng ví dụ này nhanh hơn đáng kể để thực thi vì hàng đợi.queue không chặn khi thêm các mục - phần lớn công việc được thực hiện bởi các luồng trong ví dụ này. 'Main Chờ đợi trước ... Là danh sách trong chủ đề pythonHầu hết các hoạt động danh sách là nguyên tử. Nhiều hoạt động phổ biến trong danh sách là nguyên tử, có nghĩa là chúng an toàn cho luồng.Many common operations on a list are atomic, meaning that they are thread-safe.
Python có thể chạy nhiều chủ đề không?Để tóm tắt lại, 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, không ai trong số chúng sẽ chạy cùng một lúc.Chủ đề vẫn là một lựa chọn rất tốt khi chạy nhiều tác vụ ràng buộc I/O đồng thời.threading in Python allows multiple threads to be created within a single process, but due to GIL, none of them will ever run at the exact same time. Threading is still a very good option when it comes to running multiple I/O bound tasks concurrently.
Làm cách nào để bắt đầu nhiều luồng cùng một lúc trong Python?Để thực hiện luồng trong Python, bạn phải thực hiện ba bước: kế thừa lớp chứa chức năng bạn muốn chạy trong một luồng riêng biệt bằng cách sử dụng lớp luồng.Đặt tên cho chức năng bạn muốn thực thi trong một luồng chạy ().Gọi hàm start () từ đối tượng của lớp chứa phương thức Run ().
Python có tự động đa luồng không?Nói chung, Python chỉ sử dụng một luồng để thực thi tập hợp các câu lệnh bằng văn bản.Điều này có nghĩa là trong Python, chỉ có một luồng sẽ được thực thi tại một thời điểm.Python only uses one thread to execute the set of written statements. This means that in python only one thread will be executed at a time. |