Hướng dẫn is priority queue thread safe python? - Luồng hàng đợi ưu tiên là python an toàn?
Bạn có thể sử dụng hàng đợi ưu tiên an toàn chủ đề thông qua lớp hàng đợi.thread-safe Priority Queue via the queue.PriorityQueue class. Show
Trong hướng dẫn này, bạn sẽ khám phá cách sử dụng hàng đợi ưu tiên trong Python.Priority Queues in Python. Bắt đầu nào.
Cần hàng đợi ưu tiênĐặt hàng ưu tiên Cách sử dụng ưu tiên Các mặt hàng ưu tiên Tạo một ưu tiênthreading.Thread class. Thêm các mục vào ưu tiên
Truy vấn ưu tiên kích thước Ưu tiên tham gia và nhiệm vụ được thực hiện Ví dụ về việc sử dụng ưu tiênqueue.PriorityQueue class. Chủ đề sản xuất Đặt hàng ưu tiênCách sử dụng ưu tiên Các mặt hàng ưu tiênget() relative to the order in which they were added via calls to put(). Tạo một ưu tiên
Truy vấn ưu tiên kích thước Ưu tiên tham gia và nhiệm vụ được thực hiệnheapq module that provides utilities for maintaining ordered queues using a heap data structure (a tree).
Chủ đề tiêu dùng Tạo ưu tiên và chủ đề Hoàn thành ví dụ
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. Hoàn thành ví dụ
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. Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn: Chủ đề trong Python: Hướng dẫn hoàn chỉnhTrong lập trình đồng thời, chúng ta thường cần chia sẻ dữ liệu giữa các luồng.queue.PriorityQueue class. Một cách tiếp cận để chia sẻ dữ liệu là sử dụng cấu trúc dữ liệu hàng đợi.put() and from which items can be retrieved by a call to get().
Truy vấn ưu tiên kích thước Ưu tiên tham gia và nhiệm vụ được thực hiệnPriorityQueue maintains items in the queue in priority order, which is ascending order based on the evaluated value of each item. Các mặt hàng ưu tiênVí dụ về việc sử dụng ưu tiên Chủ đề sản xuất Hoàn thành ví dụ
Một chủ đề là một chủ đề thực thi trong một chương trình máy tính. Ngoài ra, một lớp mới có thể được xác định trong đó thuộc tính đầu tiên là mức độ ưu tiên và các thuộc tính khác đại diện cho dữ liệu cho mục trên hàng đợi. Tài liệu API mô -đun hàng đợi cung cấp một ví dụ về lớp dữ liệu như vậy.queue module API documentation provides an example of such a data class. Tạo một ưu tiênHàng đợi.Priorityqueue có thể được sử dụng trước tiên tạo ra một thể hiện của lớp. Điều này sẽ tạo ra một hàng đợi không giới hạn theo mặc định, nghĩa là một hàng đợi không có giới hạn kích thước.queue.PriorityQueue can be used by first creating an instance of the class. This will create an unbounded queue by default, that is, a queue with no size limit. Ví dụ:
Một hàng đợi có thể được tạo với giới hạn kích thước bằng cách chỉ định đối số tối đa của Maxsize thành một giá trị lớn hơn 0.maxsize” argument to a value larger than zero. Ví dụ:
Một hàng đợi có thể được tạo với giới hạn kích thước bằng cách chỉ định đối số tối đa của Maxsize thành một giá trị lớn hơn 0.# đã tạo ra một hàng đợi giới hạn kích thướcput() will block until space becomes available. Thêm các mục vào ưu tiênput(), for example:
Một hàng đợi có thể được tạo với giới hạn kích thước bằng cách chỉ định đối số tối đa của Maxsize thành một giá trị lớn hơn 0.put() will block and will not use a timeout. # đã tạo ra một hàng đợi giới hạn kích thước
Một hàng đợi có thể được tạo với giới hạn kích thước bằng cách chỉ định đối số tối đa của Maxsize thành một giá trị lớn hơn 0.put() will block if the queue is full. We can choose to not block when adding items by setting the “block” argument to False. If the queue is full, then a queue.Full exception will be raised which may be handled. Ví dụ:
Thêm các mục vào ưu tiênput_nowait() function that does the same thing. Ví dụ:
Thêm các mục vào ưu tiêntimeout” argument to a positive value in seconds. If an item cannot be added before the timeout expires, then a queue.Full exception will be raised which may be handled. Ví dụ:
Thêm các mục vào ưu tiênKhi một hàng đợi giới hạn kích thước là đầy đủ, các mục mới không thể được thêm vào và các cuộc gọi để đặt () sẽ chặn cho đến khi không gian có sẵn.get(). Ví dụ:
Một hàng đợi có thể được tạo với giới hạn kích thước bằng cách chỉ định đối số tối đa của Maxsize thành một giá trị lớn hơn 0.get() will block until an item is available to retrieve from the queue and will not use a timeout. Therefore, the above call is equivalent to the following:
Một hàng đợi có thể được tạo với giới hạn kích thước bằng cách chỉ định đối số tối đa của Maxsize thành một giá trị lớn hơn 0.block” argument to False. If an item is not available to retrieve, then a queue.Empty exception will be raised and may be handled.
Thêm các mục vào ưu tiênget_nowait() function that does the same thing. Ví dụ:
Thêm các mục vào ưu tiêntimeout” argument to a positive value in seconds. If the timeout expires before an item can be retrieved, then a queue.Empty exception will be raised and may be handled. Ví dụ:
Thêm các mục vào ưu tiênKhi một hàng đợi giới hạn kích thước là đầy đủ, các mục mới không thể được thêm vào và các cuộc gọi để đặt () sẽ chặn cho đến khi không gian có sẵn.qsize() function. Ví dụ:
# Thêm một mục vào hàng đợiempty() function. Ví dụ:
Thêm các mục vào ưu tiên Ví dụ:
Thêm các mục vào ưu tiên Khi một hàng đợi giới hạn kích thước là đầy đủ, các mục mới không thể được thêm vào và các cuộc gọi để đặt () sẽ chặn cho đến khi không gian có sẵn.
Theo mặc định, cuộc gọi để đặt () sẽ chặn và sẽ không sử dụng thời gian chờ.queue.PriorityQueue classes mutex to make the operation thread-safe. Điều này sẽ ngăn chặn bất kỳ chủ đề nào khác thay đổi trạng thái của hàng đợi trong khi thực hiện thao tác của bạn. Ví dụ:
Ưu tiên tham gia và nhiệm vụ được thực hiệnMột đối tượng được thêm vào hàng đợi bằng cách đại diện cho một nhiệm vụ hoặc một đơn vị công việc. Khi một luồng người tiêu dùng gọi Get () để truy xuất mục từ hàng đợi, nó có thể cần phải xử lý nó trước khi nhiệm vụ được coi là hoàn tất.get() to retrieve the item from the queue, it may need to process it before the task is considered complete. Sau khi hoàn thành, luồng sau đó có thể gọi phương thức Task_done () trên hàng đợi để chỉ ra rằng mục được truy xuất đã được xử lý hoàn toàn.task_done() method on the queue to indicate that the item that was just retrieved has been completely processed. Ví dụ:
Ưu tiên tham gia và nhiệm vụ được thực hiện Một đối tượng được thêm vào hàng đợi bằng cách đại diện cho một nhiệm vụ hoặc một đơn vị công việc.join() function. Ví dụ:
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;task_done() function is called more times than there are items on the queue, then a ValueError will be raised to indicate the invalid state. Ưu tiên tham gia và nhiệm vụ được thực hiệnjoin() function is called after all tasks have been marked done, then the function will return immediately. Một đối tượng được thêm vào hàng đợi bằng cách đại diện cho một nhiệm vụ hoặc một đơn vị công việc.queue.PriorityQueue, let’s look at a worked example. Khi một luồng người tiêu dùng gọi Get () để truy xuất mục từ hàng đợi, nó có thể cần phải xử lý nó trước khi nhiệm vụ được coi là hoàn tất. Sau khi hoàn thành, luồng sau đó có thể gọi phương thức Task_done () trên hàng đợi để chỉ ra rằng mục được truy xuất đã được xử lý hoàn toàn. # Nhận một nhiệm vụ # Xử lý nó # ...# Đánh dấu nhiệm vụ như đã hoàn thànhqueue.PriorityQueue class with a worked example. Điều này rất hữu ích cho các chủ đề khác có thể quan tâm để biết một khi tất cả các nhiệm vụ đã được thêm vào hàng đợi đã được xử lý hoàn toàn. Các chủ đề khác có thể chờ tất cả các tác vụ hiện đang được hoàn thành bằng cách gọi hàm tham gia (). # Đợi tất cả các nhiệm vụ hiện tại trên hàng đợi được đánh dấu như đã thực hiệnqueue.PriorityQueue class. Số lượng các nhiệm vụ chưa hoàn thành tăng lên bất cứ khi nào một mặt hàng được thêm vào hàng đợi. Số lượng đi xuống bất cứ khi nào một luồng người tiêu dùng gọi Task_done () để cho biết rằng mặt hàng đã được truy xuất và tất cả hoạt động trên đó hoàn tất. Khi số lượng các nhiệm vụ chưa hoàn thành giảm xuống 0, hãy tham gia () bỏ chặn. - Đối tượng hàng đợi, Hàng đợi - Một lớp hàng đợi được đồng bộ hóaNếu hàm Task_done () được gọi là nhiều lần hơn có các mục trên hàng đợi, thì giá trịerrror sẽ được nâng lên để chỉ ra trạng thái không hợp lệ. Nếu hàm nối () được gọi sau khi tất cả các tác vụ đã được đánh dấu thực hiện, thì hàm sẽ quay lại ngay lập tức.
Đăng ký khóa học email 7 ngày miễn phí của tôi và khám phá cách sử dụng mô-đun luồng Python, bao gồm cách tạo và bắt đầu các chủ đề mới, cách sử dụng Mutex và Semaphore, và nhiều hơn nữa!random.random() function and a random integer between 0 and 10 as the priority via the random.randint() function.
Ví dụ về việc sử dụng ưu tiên
Chủ đề nhà sản xuất sẽ chạy nhanh và điền vào hàng đợi nhanh nhất có thể. Người tiêu dùng sẽ lấy các mục từ hàng đợi, chặn một phần ngẫu nhiên của một giây, sau đó báo cáo giá trị. Điều này sẽ chứng minh thứ tự ưu tiên và bản chất đa luồng của lớp hàng đợi.join() function.
Chủ đề sản xuất
Nhiệm vụ sẽ lặp lại mười lần trong một vòng lặp. Một cách tiếp cận khác sẽ là thêm một tuple với mức độ ưu tiên rất thấp (giá trị số nguyên lớn hoặc ngoài dải) và giá trị dữ liệu của không có. Mục này sẽ được xử lý cuối cùng bởi luồng người tiêu dùng và không yêu cầu luồng nhà sản xuất tham gia.None. This item would be processed last by the consumer thread and not require the producer thread to join.
Hàm của nhà sản xuất () bên dưới thực hiện điều này bằng cách lấy thể hiện hàng đợi làm đối số.producer() function below implements this by taking the queue instance as an argument.
Chủ đề tiêu dùngTiếp theo, chúng ta có thể xác định chức năng sẽ được thực hiện bởi luồng người tiêu dùng. Nhiệm vụ sẽ lặp lại mãi mãi. Mỗi lần lặp, nó sẽ nhận được một mục từ hàng đợi và khối nếu chưa có mục nào. Nếu mục được lấy từ hàng đợi là giá trị không có, thì nhiệm vụ sẽ phá vỡ vòng lặp và chấm dứt luồng. Mặt khác, giá trị phân số được sử dụng để chặn với một cuộc gọi theo thời gian.s ngủ () và sau đó được báo cáo. Mục sau đó được đánh dấu là được xử lý thông qua cuộc gọi đến Task_done ().None, then the task will break the loop and terminate the thread. Otherwise, the fractional value is used to block with a call to time.sleep() and is then reported. The item is then marked as processed via a call to task_done(). Các mục báo cáo khi chúng được truy xuất sẽ chứng minh rằng chúng được xử lý theo thứ tự ưu tiên. Hàm người tiêu dùng () bên dưới thực hiện điều này và lấy thể hiện hàng đợi làm đối số.consumer() function below implements this and takes the queue instance as an argument.
Tạo ưu tiên và chủ đềCuối cùng, trong chủ đề chính, chúng ta có thể tạo phiên bản hàng đợi được chia sẻ.
Sau đó, chúng ta có thể định cấu hình và bắt đầu luồng nhà sản xuất, sẽ tạo công việc và thêm nó vào hàng đợi để người tiêu dùng truy xuất.
Sau đó, chúng tôi có thể định cấu hình và bắt đầu chuỗi người tiêu dùng, điều này sẽ kiên nhẫn chờ công việc đến hàng đợi.
Chủ đề chính sau đó sẽ chặn cho đến khi cả chủ đề của nhà sản xuất và người tiêu dùng chấm dứt, sau đó tự chấm dứt.
Hoàn thành ví dụKết hợp điều này lại với nhau, ví dụ hoàn chỉnh về việc sử dụng hàng đợi.queue.PriorityQueue is listed below.
Chạy ví dụ đầu tiên tạo ra ví dụ hàng đợi được chia sẻ.queue.PriorityQueue instance. Chủ đề của nhà sản xuất và các luồng người tiêu dùng được cấu hình và bắt đầu và các luồng chủ đề chính cho đến khi các luồng mới chấm dứt. Tiếp theo, luồng nhà sản xuất tạo ra một giá trị ngẫu nhiên mới và mức độ ưu tiên ngẫu nhiên mỗi lần lặp của tác vụ và thêm chúng như một tuple vào hàng đợi. Chủ đề nhà sản xuất không chặn để nó thêm tất cả các giá trị của nó vào hàng đợi trước khi luồng người tiêu dùng bắt đầu xử lý. Chủ đề nhà sản xuất hoàn thành tất cả các mặt hàng của nó trên hàng đợi và sau đó chặn các hàng đợi cho đến khi tất cả các công việc đã được đánh dấu như đã thực hiện. Chủ đề của người tiêu dùng chờ đợi trên hàng đợi cho các mặt hàng đến, sau đó tiêu thụ chúng mỗi lần theo thứ tự ưu tiên. Đối với mỗi mặt hàng được tiêu thụ, luồng người tiêu dùng chặn trong một khoảnh khắc, sau đó báo cáo giá trị. Tất cả các đơn vị công việc được đánh dấu là thực hiện. Nhà sản xuất được thông báo rằng tất cả các đơn vị công việc được thực hiện, sau đó gửi giá trị không có để báo hiệu cho người tiêu dùng rằng không có đơn vị công việc nào được mong đợi, sau đó chấm dứt. Chủ đề người tiêu dùng có được giá trị không có, phá vỡ vòng lặp của nó và cũng chấm dứt. Điều này nhấn mạnh làm thế nào hàng đợi.Priorityqueue có thể được sử dụng để chia sẻ dữ liệu dễ dàng giữa các chủ đề của nhà sản xuất và người tiêu dùng và các mặt hàng đó có thể được tiêu thụ từ hàng đợi theo thứ tự ưu tiên.queue.PriorityQueue can be used to share data easily between a producer and consumer threads and that items can be consumed from the queue in priority order. Một đầu ra mẫu của chương trình được liệt kê dưới đây. Lưu ý, đầu ra cụ thể của bạn sẽ khác nhau khi sử dụng các số ngẫu nhiên. Chúng ta có thể thấy rằng thực sự các thông điệp được thêm vào hàng đợi đã được xử lý theo thứ tự ưu tiên (giá trị số nguyên tăng dần).
Đọc thêmPhần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.
TakeawaysBây giờ bạn đã biết cách sử dụng ưu tiên an toàn chủ đề trong Python.PriorityQueue in Python. Bạn có câu hỏi nào không? Đặt câu hỏi của bạn trong các ý kiến dưới đây và tôi sẽ cố gắng hết sức để trả lời. Ảnh của Taras Chernus trên unplash Các bộ sưu tập python có phải là chủ đề khôngNgoài ra, các hoạt động nối tiếp và pop trên các deques cũng an toàn và hiệu quả bộ nhớ.Các tính năng này làm cho các deques đặc biệt hữu ích để tạo các ngăn xếp và hàng đợi tùy chỉnh trong Python.append and pop operations on deques are also thread safe and memory efficient. These features make deques particularly useful for creating custom stacks and queues in Python.
Là chủ đề in python 3Hàm in () là một hàm tích hợp để in chuỗi trên stdout và không an toàn cho luồng.not thread-safe.
Có hàng đợi ưu tiên trong Python không?Python cung cấp một triển khai tích hợp cấu trúc dữ liệu hàng đợi ưu tiên.Kể từ hàng đợi.Lớp ưu tiên cần duy trì thứ tự các yếu tố của nó, một cơ chế sắp xếp được yêu cầu mỗi khi một yếu tố mới được đưa ra.Python giải quyết điều này bằng cách sử dụng một đống nhị phân để thực hiện hàng đợi ưu tiên.. Since the queue. PriorityQueue class needs to maintain the order of its elements, a sorting mechanism is required every time a new element is enqueued. Python solves this by using a binary heap to implement the priority queue.
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.
Là chủ đề từ điểnHầu hết các hoạt động từ điển đều là nguyên tử nhiều hoạt động phổ biến trên một tài sản là nguyên tử, có nghĩa là chúng an toàn cho luồng.Many common operations on a dict are atomic, meaning that they are thread-safe. |