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.

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ên
    • Thêm các mục vào ưu tiên
    • Nhận các mặt hàng 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ện
  • Ví dụ về việc sử dụng ưu tiên
    • Chủ đề sản xuất
    • Chủ đề tiêu dùng
    • Tạo ưu tiên và chủ đề
    • Hoàn thành ví dụ
  • Đọc thêm
  • Takeaways

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

  • Nhận các mặt hàng 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ện

Ví dụ về việc sử dụng ưu tiênqueue.PriorityQueue class.

Chủ đề sản xuất

Đặt hàng ưu tiên

Cá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

Thêm các mục vào ưu tiên

Nhận các mặt hàng 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).

Ví dụ về việc sử dụng ưu tiên

Chủ đề sản xuất

Chủ đề tiêu dùng

Tạo ưu tiên và chủ đề

Hoàn thành ví dụ

Đọc thêm..

Takeaways

queue.put('7').put('7')

queue.put('9').put('9')

queue.put('2').put('2')

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ụ

Đọ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.=queue.get()# 2

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.=queue.get()# 7

Đô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. =queue.get()# 9

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:
Download my FREE PDF cheat sheet

Chủ đề trong Python: Hướng dẫn hoàn chỉnh

Trong 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().

Python cung cấp một số hàng đợi an toàn chủ đề trong mô-đun hàng đợi, chẳng hạn như lớp hàng đợi.

Nhận các mặt hàng 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ệ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ên

Ví dụ về việc sử dụng ưu tiên

Chủ đề sản xuất

Hoàn thành ví dụ

Đọc thêm..

Takeaways

item=(priority,data)=(priority,data)

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ên

Hà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ụ:

.....

# đã tạo ra một hàng đợi không giới hạn

queue=queue.PriorityQueue()=queue.PriorityQueue()

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ụ:

.....

# đã tạo ra một hàng đợi không giới hạn

queue=queue.PriorityQueue(maxsize=100)=queue.PriorityQueue(maxsize=100)

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:

.....

# đã tạo ra một hàng đợi không giới hạn

queue.put(item).put(item)

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

.....

# đã tạo ra một hàng đợi không giới hạn

queue.put(item,block=True,timeout=None).put(item,block=True,timeout=None)

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ụ:

.....

# đã tạo ra một hàng đợi không giới hạn

try::

    queue.put(item,block=False)queue.put(item,block=False)

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.queue.Full:

# đã tạo ra một hàng đợi giới hạn kích thước# ...

Thêm các mục vào ưu tiênput_nowait() function that does the same thing.

Ví dụ:

.....

# đã tạo ra một hàng đợi không giới hạn

try::

    queue.put_nowait(item)queue.put_nowait(item)

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.queue.Full:

# đã tạo ra một hàng đợi giới hạn kích thước# ...

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ụ:

.....

# đã tạo ra một hàng đợi không giới hạn

try::

    queue.put(item,timeout=5)queue.put(item,timeout=5)

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.queue.Full:

# đã tạo ra một hàng đợi giới hạn kích thước# ...

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.get().

Ví dụ:

.....

# đã tạo ra một hàng đợi không giới hạn

item=queue.get()=queue.get()

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:

.....

# đã tạo ra một hàng đợi không giới hạn

item=queue.get(block=True,timeout=0)=queue.get(block=True,timeout=0)

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.

.....

# đã tạo ra một hàng đợi không giới hạn

try::

    item=queue.get(block=False)item=queue.get(block=False)

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.queue.Empty:

# đã tạo ra một hàng đợi giới hạn kích thước# ...

Thêm các mục vào ưu tiênget_nowait() function that does the same thing.

Ví dụ:

.....

# đã tạo ra một hàng đợi không giới hạn

try::

    item=queue.get_nowait()item=queue.get_nowait()

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.queue.Empty:

# đã tạo ra một hàng đợi giới hạn kích thước# ...

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ụ:

.....

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.

try::

    item=queue.get(timeout=10)item=queue.get(timeout=10)

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.queue.Empty:

# đã tạo ra một hàng đợi giới hạn kích thước# ...

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.qsize() function.

Ví dụ:

.....

Các mục có thể được thêm vào hàng đợi thông qua một cuộc gọi để đặt (), ví dụ:

size=queue.qsize()=queue.qsize()

# Thêm một mục vào hàng đợiempty() function.

Ví dụ:

.....

Theo mặc định, cuộc gọi để đặt () sẽ chặn và sẽ không sử dụng thời gian chờ.

ifqueue.empty():queue.empty():

# đã tạo ra một hàng đợi giới hạn kích thước# ...

Thêm các mục vào ưu tiên

Ví dụ:

.....

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.

ifqueue.full():queue.full():

# đã tạo ra một hàng đợi giới hạn kích thước# ...

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.

.....

Các mục có thể được thêm vào hàng đợi thông qua một cuộc gọi để đặt (), ví dụ:

ifnotqueue.full():notqueue.full():

# Thêm một mục vào hàng đợi# add an item to the queue

    queue.put_nowait(item)queue.put_nowait(item)

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ụ:

.....

# có được khóa trên hàng đợi

với hàng đợi.mutex:queue.mutex:

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem hàng đợi có không gian# check if the queue has space

    ifnotqueue.full():ifnotqueue.full():

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# add an item to the queue

        queue.put_nowait(item)queue.put_nowait(item)

Ư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.

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ụ:

.....

# có được khóa trên hàng đợi

item=queue.get()=queue.get()

với hàng đợi.mutex:

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem hàng đợi có không gian

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

queue.task_done().task_done()

Ư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ụ:

.....

# có được khóa trên hàng đợi

queue.join().join()

với hàng đợi.mutex:

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem hàng đợi có không gian

& 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óa

Nế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.

.....

Bây giờ chúng ta đã biết cách sử dụng hàng đợi.

foriinrange(10):iinrange(10):

Khóa học luồng python miễn phí# ...

Đă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.

.....

Nhấp vào nút bên dưới và nhập địa chỉ email của bạn để đăng ký và nhận bài học đầu tiên ngay bây giờ.

value=random()=random()

Bắt đầu khóa học email miễn phí của bạn ngay bây giờ! & NBSP;

priority=randint(0,10)=randint(0,10)

Ví dụ về việc sử dụng ưu tiên

.....

Chúng ta có thể khám phá cách sử dụng lớp hàng đợi.

item=(priority,value)=(priority,value)

Trong ví dụ này, chúng tôi sẽ tạo một luồng nhà sản xuất sẽ tạo mười số ngẫu nhiên dưới dạng dữ liệu và đưa chúng lên hàng đợi với mức độ ưu tiên được xác định ngẫu nhiên. Chúng tôi cũng sẽ tạo một luồng người tiêu dùng sẽ nhận được số từ hàng đợi theo thứ tự ưu tiên (thứ tự tăng dần hoặc giá trị thấp hơn là ưu tiên cao hơn) và báo cáo giá trị của chúng.

queue.put(item).put(item)

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.

.....

Ngoài ra, người tiêu dùng sẽ đánh dấu từng mặt hàng như đã thực hiện. Điều này sẽ hữu ích cho nhà sản xuất để biết khi nào tất cả các mặt hàng đã được xử lý để có thể gửi tín hiệu tắt đặc biệt đến người tiêu dùng, được gọi là giá trị Sentinel.

queue.join().join()

Chủ đề sản xuất

.....

Đầu tiên, chúng ta có thể xác định chức năng sẽ được thực hiện bởi luồng nhà sản xuất.

queue.put(None).put(None)

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.

.....

# Gửi giá trị Sentinel với mức độ ưu tiên thấp nhất

queue.put((100,None)).put((100,None))

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.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# Tạo công việc

Nhà sản xuất def (Hàng đợi):producer(queue):

& nbsp; & nbsp; & nbsp; & nbsp; in ('nhà sản xuất: chạy')print('Producer: Running')

& nbsp; & nbsp; & nbsp; & nbsp;# tạo công việc# generate work

    foriinrange(10):foriin range(10):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;## generate a value

        value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# generate a priority

        priority=randint(0,10)priority =randint(0,10)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;## create an item

        item=(priority,value)item=(priority,value)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# add to the queue

        queue.put(item)queue.put(item)

& nbsp; & nbsp; & nbsp; & nbsp;# chờ tất cả các mục được xử lý# wait for all items to be processed

    queue.join()queue.join()

& nbsp; & nbsp; & nbsp; & nbsp;# gửi giá trị sentinel# send sentinel value

    queue.put(None)queue.put(None)

& nbsp; & nbsp; & nbsp; & nbsp; print ('nhà sản xuất: xong')print('Producer: Done')

Chủ đề tiêu dùng

Tiế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.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# Tiêu thụ công việc

Người tiêu dùng def (Hàng đợi):consumer(queue):

& nbsp; & nbsp; & nbsp; & nbsp; in ('người tiêu dùng: chạy')print('Consumer: Running')

& nbsp; & nbsp; & nbsp; & nbsp;# tiêu thụ công việc# consume work

    whileTrue:whileTrue:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# get a unit of work

        item=queue.get()item=queue.get()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# check for stop

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;ifitem isNone:

            breakbreak

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP;# block

        sleep(item[1])sleep(item[1])

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# báo cáo# report

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'>got {item}')

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# mark it as processed

        queue.task_done()queue.task_done()

& nbsp; & nbsp; & nbsp; & nbsp;# tất cả đã hoàn thành# all done

& nbsp; & nbsp; & nbsp; & nbsp; in ('người tiêu dùng: xong')print('Consumer: Done')

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ẻ.

.....

# Tạo hàng đợi được chia sẻ

queue=PriorityQueue()=PriorityQueue()

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.

.....

# Bắt đầu nhà sản xuất

producer=Thread(target=producer,args=(queue,))=Thread(target=producer,args=(queue,))

producer.start().start()

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.

.....

# Bắt đầu người tiêu dùng

consumer=Thread(target=consumer,args=(queue,))=Thread(target=consumer,args=(queue,))

consumer.start().start()

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.

.....

# Đợi tất cả các chủ đề kết thúc

producer.join().join()

consumer.join().join()

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.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

# SuperfastPython.com

# Ví dụ về việc sử dụng hàng đợi ưu tiên

từ thời gian nhập vào giấc ngủtime import sleep

từ nhập ngẫu nhiên ngẫu nhiênrandom import random

từ nhập khẩu ngẫu nhiên randintrandom import randint

từ luồng nhập luồngthreading import Thread

từ hàng đợi nhập khẩu ưu tiênqueue import PriorityQueue

# Tạo công việc

Nhà sản xuất def (Hàng đợi):producer(queue):

& nbsp; & nbsp; & nbsp; & nbsp; in ('nhà sản xuất: chạy')print('Producer: Running')

& nbsp; & nbsp; & nbsp; & nbsp;# tạo công việc# generate work

    foriinrange(10):fori inrange(10):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;## generate a value

        value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# generate a priority

        priority=randint(0,10)priority =randint(0,10)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;## create an item

        item=(priority,value)item=(priority,value)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# add to the queue

        queue.put(item)queue.put(item)

& nbsp; & nbsp; & nbsp; & nbsp;# chờ tất cả các mục được xử lý# wait for all items to be processed

    queue.join()queue.join()

& nbsp; & nbsp; & nbsp; & nbsp;# gửi giá trị sentinel# send sentinel value

    queue.put(None)queue.put(None)

& nbsp; & nbsp; & nbsp; & nbsp; print ('nhà sản xuất: xong')print('Producer: Done')

# Tiêu thụ công việc

Người tiêu dùng def (Hàng đợi):consumer(queue):

& nbsp; & nbsp; & nbsp; & nbsp; in ('người tiêu dùng: chạy')print('Consumer: Running')

& nbsp; & nbsp; & nbsp; & nbsp;# tiêu thụ công việc# consume work

    whileTrue:while True:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# get a unit of work

        item=queue.get()item=queue.get()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# check for stop

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;if item isNone:

            breakbreak

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP;# block

        sleep(item[1])sleep(item[1])

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# báo cáo# report

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'>got {item}')

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# mark it as processed

        queue.task_done()queue.task_done()

& nbsp; & nbsp; & nbsp; & nbsp;# tất cả đã hoàn thành# all done

& nbsp; & nbsp; & nbsp; & nbsp; in ('người tiêu dùng: xong')print('Consumer: Done')

# Tạo hàng đợi được chia sẻ

queue=PriorityQueue()=PriorityQueue()

# Bắt đầu nhà sản xuất

producer=Thread(target=producer,args=(queue,))=Thread(target=producer, args=(queue,))

producer.start().start()

# Bắt đầu người tiêu dùng

consumer=Thread(target=consumer,args=(queue,))=Thread(target=consumer, args=(queue,))

consumer.start().start()

# Chờ các chủ đề kết thúc

producer.join().join()

consumer.join().join()

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).

Nhà sản xuất: Chạy

Người tiêu dùng: Chạy

> Got (0, 0.0828697796138792)

> Got (0, 0.4530969199311018)

> Got (1, 0.6194263138195527)

> Got (1, 0.933420944414303)

> Got (2, 0,5545498132122124)

> Got (2, 0.6857092203915951)

> Got (3, 0.3501221466243839)

> Got (7, 0.19032109263026764)

> Got (8, 0,5022069566894527)

> Got (9, 0.8435921663610007)

Nhà sản xuất: Thực hiện

Người tiêu dùng: Thực hiện

Đọc thêm

Phần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.

  • Chủ đề - song song dựa trên luồng
  • Chủ đề: Hướng dẫn hoàn chỉnh
  • Bảng xác định API mô -đun chủ đề
  • Chủ đề câu hỏi phỏng vấn API
  • Khởi động nhảy luồng (khóa học 7 ngày của tôi)

Takeaways

Bâ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.
Ask your questions in the comments below and I will do my best to answer.

Ảnh của Taras Chernus trên unplash

Các bộ sưu tập python có phải là chủ đề không

Ngoà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 3

Hà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ủ đề python

Hầ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ển

Hầ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.