Hướng dẫn python thread safe print - chủ đề python in an toàn

Bạn có thể thực hiện các cuộc gọi an toàn luồng để in () bằng khóa mutex như Threading.lock.thread-safe calls to print() using a mutex lock such as threading.Lock.

Trong hướng dẫn này, bạn sẽ khám phá cách thực hiện các cuộc gọi để in () an toàn bằng luồng trong Python.print() thread-safe in Python.

Bắt đầu nào.

  • Cần in an toàn chủ đề
  • Cách in an toàn cho chủ đề
  • Ví dụ về bản in không an toàn
  • Ví dụ về bản in an toàn chủ đề
  • Ví dụ về chủ đề in chuyên dụng với hàng đợi
  • Đọ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.

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.threading.Thread class.

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ỉnh

Trong lập trình đồng thời, chúng tôi có thể muốn in các câu lệnh vào dòng lệnh (còn được gọi là dấu nhắc thiết bị đầu cuối hoặc lệnh) thông qua chức năng tích hợp in ().

Điều này có thể là vì nhiều lý do, chẳng hạn như:

  • Đầu ra chính từ chương trình cho người dùng.
  • Gỡ lỗi các câu lệnh in cho chủ đề.
  • Báo cáo tiến trình của các nhiệm vụ trong các chủ đề.

Gọi print () có phải là an toàn cho luồng không? Nếu không, làm thế nào chúng ta có thể làm cho in safe?

Cách in an toàn cho chủ đề

Ví dụ về bản in không an toànprint() function is a built-in function for printing a string on stdout and is not thread-safe.

Ví dụ về bản in an toàn chủ đềprint() function takes a string message, or an object that can be converted to a string.

Ví dụ về chủ đề in chuyên dụng với hàng đợi

Đọ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.('Hi there')

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.\n‘, although an alternate ending can be specified via the “end” argument.

Đô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.end” value of None will not include a separator between messages, printing on the same line.

Ví dụ về chủ đề in chuyên dụng với hàng đợi

Đọc thêm..

Takeaways

print('Hello',end=None)('Hello',end=None)

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.flush” argument to True.

Ví dụ về chủ đề in chuyên dụng với hàng đợi

Đọc thêm..

Takeaways

print('Hello',flush=True)('Hello',flush=True)

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.file” argument.

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.print() function thread-safe, it needs to be treated as a critical section and protected with a mutual exclusion (mutex) lock.

Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:threading.Lock class.

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

Đọc thêm..

Takeaways

lock=threading.Lock()=threading.Lock()

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.

Ví dụ về chủ đề in chuyên dụng với hàng đợi

Đọc thêm..

Takeaways

lock.acquire().acquire()

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.

print('...')('...')

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.

lock.release().release()

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

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ỉnhthreading.Lock class.

Ví dụ về chủ đề in chuyên dụng với hàng đợi

Đọ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.lock:

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.

print('...')('...')

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

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

Ví dụ về bản in không an toàn

Trong lập trình đồng thời, chúng tôi có thể muốn in các câu lệnh vào dòng lệnh (còn được gọi là dấu nhắc thiết bị đầu cuối hoặc lệnh) thông qua chức năng tích hợp in ().print(), let’s look at an example of how calling print from multiple threads is not thread-safe.

Điều này có thể là vì nhiều lý do, chẳng hạn như:

Đầu tiên, chúng tôi sẽ xác định một hàm có một số nguyên duy nhất cho tác vụ, tạo một số ngẫu nhiên bằng cách gọi Random.random (), khối bằng cách gọi thời gian.s ngủ () sau đó báo cáo số bằng cách gọi print () bằng chuỗi được định dạng.random.random(), blocks by calling time.sleep() then reports the number by calling print() with a formatted string.

Hàm nhiệm vụ () bên dưới thực hiện điều này.task() function below implements this.

# Nhiệm vụ cho các chủ đề công nhân

nhiệm vụ def (số):task(number):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo số ngẫu nhiên trong khoảng từ 0 đến 1# generate random number between 0 and 1

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối# block

    sleep(value)sleep(value)

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

& nbsp; & nbsp; & nbsp; & nbsp; print (f'thread {number} got {value}. ')print(f'Thread {number} got {value}.')

Tiếp theo, trong luồng chính, chúng ta có thể tạo 1.000 phiên bản của lớp luồng.threading.Thread class, each configured to call our task() function with a unique integer from 0 to 999.

Chúng ta có thể làm điều này trong một danh sách hiểu để tạo danh sách các đối tượng luồng.threading.Thread objects.

.....

# Định cấu hình nhiều luồng

threads=[Thread(target=task,args=(i,))foriinrange(1000)]=[Thread(target=task,args=(i,))foriin range(1000)]

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().start() method on each thread to start their execution, and then wait for all threads to finish by calling the join() method.

.....

# Định cấu hình nhiều luồng

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().thread inthreads:

    thread.start()thread.start()

# Bắt đầu chủ đề

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().thread in threads:

    thread.join()thread.join()

# Bắt đầu chủ đề

Inthreads forthreads:

# Chờ các chủ đề kết thúcflush” argument to True, requiring that the stream always flush messages.

.....

# Định cấu hình nhiều luồng

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().(f'Thread {number} got {value}.',flush=True)

# Bắt đầu chủ đề

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Inthreads forthreads:

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

Chúng tôi hy vọng một điều kiện cuộc đua trong câu lệnh in vì tất cả 1.000 chủ đề sẽ cố gắng in đồng thời tin nhắn.random import random

Kết quả sẽ là sự tham nhũng của các tin nhắn được in, thay vì một thông báo sạch cho mỗi dòng.time import sleep

Lưu ý, đây vẫn là một vấn đề, ngay cả khi chúng tôi đặt đối số của Flush Flush thành True, yêu cầu luồng luôn luôn xóa các tin nhắn.threading import Thread

# Nhiệm vụ cho các chủ đề công nhân

nhiệm vụ def (số):task(number):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo số ngẫu nhiên trong khoảng từ 0 đến 1# generate random number between 0 and 1

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối# block

    sleep(value)sleep(value)

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

& nbsp; & nbsp; & nbsp; & nbsp; print (f'thread {number} got {value}. ')print(f'Thread {number} got {value}.')

# Định cấu hình nhiều luồng

threads=[Thread(target=task,args=(i,))foriinrange(1000)]=[Thread(target=task, args=(i,))foriinrange(1000)]

# Định cấu hình nhiều luồng

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().thread inthreads:

    thread.start()thread.start()

# Bắt đầu chủ đề

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().thread inthreads:

    thread.join()thread.join()

# Bắt đầu chủ đềtask() function.

Inthreads forthreads:

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

Chúng tôi hy vọng một điều kiện cuộc đua trong câu lệnh in vì tất cả 1.000 chủ đề sẽ cố gắng in đồng thời tin nhắn.

Kết quả sẽ là sự tham nhũng của các tin nhắn được in, thay vì một thông báo sạch cho mỗi dòng.

Lưu ý, đây vẫn là một vấn đề, ngay cả khi chúng tôi đặt đối số của Flush Flush thành True, yêu cầu luồng luôn luôn xóa các tin nhắn.

# báo cáo

PRIN

Kết hợp điều này lại với nhau, ví dụ hoàn chỉnh về in không an toàn chủ đề được liệt kê dưới đây.

# SuperfastPython.com

# Ví dụ về in không an toàn cho chủ đề

từ nhập ngẫu nhiên ngẫu nhiên

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

từ luồng nhập luồng

Chạy ví dụ trước tiên tạo 1.000 luồng và định cấu hình chúng để thực thi hàm Task () của chúng tôi.

Các luồng được bắt đầu và các khối chủ đề chính cho đến khi tất cả các luồng bị chấm dứt.

...

# Định cấu hình nhiều luồngprint() function is not thread-safe.

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().


# Bắt đầu chủ đề

Inthreads forthreads:

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

Chúng tôi hy vọng một điều kiện cuộc đua trong câu lệnh in vì tất cả 1.000 chủ đề sẽ cố gắng in đồng thời tin nhắn.
 


Kết quả sẽ là sự tham nhũng của các tin nhắn được in, thay vì một thông báo sạch cho mỗi dòng.

Lưu ý, đây vẫn là một vấn đề, ngay cả khi chúng tôi đặt đối số của Flush Flush thành True, yêu cầu luồng luôn luôn xóa các tin nhắn.

# báo cáotask() function can then be updated so that the lock must be acquired prior to calling the print statement.

PRINtask() function to take a lock as an argument.

# Nhiệm vụ cho các chủ đề công nhân

Kết hợp điều này lại với nhau, ví dụ hoàn chỉnh về in không an toàn chủ đề được liệt kê dưới đây.task(number,lock):

# SuperfastPython.com

# Ví dụ về in không an toàn cho chủ đềprint() to be protected by the lock using the context manager interface.

.....

# Định cấu hình nhiều luồng

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().lock:

& nbsp; & nbsp; & nbsp; & nbsp; print (f'thread {number} got {value}. ')print(f'Thread {number} got {value}.')

# Bắt đầu chủ đề

.....

# Định cấu hình nhiều luồng

lock=Lock()=Lock()

Sau đó, chúng ta có thể gọi phương thức start () trên mỗi luồng để bắt đầu thực thi của họ và sau đó đợi tất cả các luồng kết thúc bằng cách gọi phương thức tham gia ().

.....

# Định cấu hình nhiều luồng

threads=[Thread(target=task,args=(i,lock))foriinrange(1000)]=[Thread(target=task,args=(i,lock))fori inrange(1000)]

Kết hợp điều này lại với nhau, ví dụ hoàn chỉnh về việc gọi hàm in () theo cách an toàn luồng được liệt kê bên dưới.print() function in a thread-safe manner 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

# SuperfastPython.com

# Ví dụ về in an toàn chủ đề

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

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

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

từ khóa nhập khẩu renthreading import Lock

# Nhiệm vụ cho các chủ đề công nhân

nhiệm vụ def (số, khóa):task(number,lock):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo số ngẫu nhiên trong khoảng từ 0 đến 1# generate random number between 0 and 1

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối# block

    sleep(value)sleep(value)

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

& nbsp; & nbsp; & nbsp; & nbsp; với khóa:with lock:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'Thread {number} got {value}.')

# Tạo khóa chia sẻ

lock=Lock()=Lock()

# Định cấu hình nhiều luồng

threads=[Thread(target=task,args=(i,lock))foriinrange(1000)]=[Thread(target=task,args=(i,lock))foriin range(1000)]

# Bắt đầu chủ đề

Inthreads forthreads:thread inthreads:

    thread.start()thread.start()

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

Inthreads forthreads:thread in threads:

    thread.join()thread.join()

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

Đầu tiên, một khóa chia sẻ được tạo ra.

Chạy ví dụ tạo và định cấu hình 1.000 luồng, chuyển khóa cho mỗi.

Chủ đề chính bắt đầu tất cả các luồng công nhân sau đó chờ tất cả các luồng chấm dứt.

Mỗi luồng tạo ra số ngẫu nhiên, các khối, sau đó cố gắng để có được khóa. Sau khi có được, luồng sẽ báo cáo tin nhắn của mình và sau đó phát hành khóa.

Một ví dụ bị cắt ngắn của đầu ra được liệt kê dưới đây.

Kết quả là một thông báo Clean One trên mỗi dòng không có sự tham nhũng của các tin nhắn được nhìn thấy với phiên bản Thread-Unsafe.

Lưu ý, kết quả cụ thể của bạn sẽ khác nhau mỗi khi chương trình được chạy do sử dụng các số ngẫu nhiên.

Chủ đề 42 có 0,005379425682188854.

Chủ đề 49 có 0,01657114573560836.

Chủ đề 430 có 0,0015830746201580537.

Chủ đề 179 có 0,014964866854160097.

Chủ đề 13 có 0,03264742234329243.

Chủ đề 298 có 0,019898887953053612.

Chủ đề 625 có 0,0033862268764470738.

Chủ đề 121 có 0,0318745316694633.

Chủ đề 480 có 0,012546040877055908.

Chủ đề 208 có 0,0286350084811009.

Chủ đề 346 có 0,023910737473838983.

...

Chủ đề 142 có 0,037197126768493516.

Tiếp theo, hãy để Lôi nhìn vào một ví dụ về cách chúng ta có thể in một cách an toàn chủ đề bằng cách sử dụng một luồng chuyên dụng.

Ví dụ về chủ đề in chuyên dụng với hàng đợi

Một cách tiếp cận khác để in an toàn chủ đề là sử dụng một luồng chuyên dụng duy nhất để thực hiện tất cả các bản in.print(), it is guaranteed to be thread-safe.

Bởi vì chỉ có một luồng có thể gọi in (), nó được đảm bảo là an toàn cho luồng.

Điều này có thể đạt được bằng cách tạo một hàng đợi được chia sẻ giữa tất cả các chủ đề cần in. Chủ đề có thể đặt tin nhắn trên hàng đợi. Một luồng chuyên dụng để in có thể được tạo ra trong nền và nhận tin nhắn từ hàng đợi và gọi điện.

Chúng tôi có thể cập nhật phiên bản chủ đề được phát triển ở trên để sử dụng phương pháp in chuyên dụng này.get() and report the messages by calling print().

Đầu tiên, chúng ta có thể xác định một chức năng tác vụ được thực thi bởi luồng in. Hàm này sẽ lấy hàng đợi được chia sẻ làm đối số. Nó sẽ lặp lại mãi mãi và nhận tin nhắn từ hàng đợi bằng cách gọi get () và báo cáo các tin nhắn bằng cách gọi print ().printer() function below implements this.

Hàm máy in () bên dưới thực hiện điều này.

# Nhiệm vụ cho chủ đề inprinter(queue):

    whileTrue:whileTrue:

Máy in def (Hàng đợi):# get messages

        message=queue.get()message= queue.get()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# print the message

        print(message)print(message)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# inQueue.get(), meaning that it will be computationally efficient.

Chủ đề máy in sẽ chặn cho đến khi các thông báo xuất hiện trên hàng đợi thông qua lệnh gọi đến Queue.get (), có nghĩa là nó sẽ có hiệu quả về mặt tính toán.

  • Bạn có thể tìm hiểu thêm về việc chặn các cuộc gọi trong hướng dẫn này:

Chủ đề chặn cuộc gọi trong Pythontask() function executed by worker threads to take the shared queue as an argument and to put messages on the queue instead of calling print.

Tiếp theo, chúng tôi có thể cập nhật hàm Task () của chúng tôi được thực hiện bởi các luồng công nhân để lấy hàng đợi được chia sẻ làm đối số và đưa tin nhắn lên hàng đợi thay vì gọi in.task() function with these changes is listed below.

# Nhiệm vụ cho các chủ đề công nhân

nhiệm vụ def (số, khóa):task(number,queue):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo số ngẫu nhiên trong khoảng từ 0 đến 1# generate random number between 0 and 1

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối# block

    sleep(value)sleep(value)

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

& nbsp; & nbsp; & nbsp; & nbsp; với khóa:queue.put(f'Thread {number} got {value}.')

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;queue.Queue class. This is a thread-safe data structure on which messages as objects can be appended via put() and removed and retrieved via get().

.....

# Tạo khóa chia sẻ

queue=Queue()=Queue()

# Bắt đầu chủ đềprinter() function, to run in the background by setting “daemon” to True and to give it a useful name like ‘Printer‘.

.....

# Tạo luồng in

printer_thread=Thread(target=printer,args=(queue,),daemon=True,name='Printer')=Thread(target=printer,args=(queue,),daemon=True, name='Printer')

printer_thread.start().start()

Bởi vì luồng máy in là một luồng daemon, nó sẽ chạy ở chế độ nền và sẽ không ngăn quá trình Python kết thúc một khi tất cả các luồng công nhân và luồng chính chấm dứt.

Bạn có thể tìm hiểu thêm về các chủ đề daemon trong hướng dẫn này:

  • Cách sử dụng các chủ đề daemon trong Python

Cuối cùng, chúng ta có thể chuyển thể hiện của hàng đợi được chia sẻ cho mỗi luồng công nhân như một đối số.

.....

# Định cấu hình nhiều luồng

threads=[Thread(target=task,args=(i,queue))foriinrange(1000)]=[Thread(target=task,args=(i,queue))fori inrange(1000)]

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 một chủ đề in chuyên dụng được liệt kê dưới đây.

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

# SuperfastPython.com

# Ví dụ về chủ đề in và hàng đợi an toàn chủ đề

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

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

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

từ hàng đợi hàng đợiqueue import Queue

# Nhiệm vụ cho chủ đề in

Máy in def (Hàng đợi):printer(queue):

    whileTrue:whileTrue:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# get messages

        message=queue.get()message= queue.get()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# in# print the message

        print(message)print(message)

# Nhiệm vụ cho các chủ đề công nhân

nhiệm vụ def (số, hàng đợi):task(number, queue):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo số ngẫu nhiên trong khoảng từ 0 đến 1# generate random number between 0 and 1

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối# block

    sleep(value)sleep(value)

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

& nbsp; & nbsp; & nbsp; & nbsp; hàng đợi.put (f'thread {number} got {value}. ')queue.put(f'Thread {number} got {value}.')

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

queue=Queue()=Queue()

# Tạo luồng in

printer_thread=Thread(target=printer,args=(queue,),daemon=True,name='Printer')= Thread(target=printer,args=(queue,),daemon=True,name='Printer')

printer_thread.start().start()

# Định cấu hình nhiều luồng

threads=[Thread(target=task,args=(i,queue))foriinrange(1000)]=[Thread(target=task,args=(i,queue))foriin range(1000)]

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 một chủ đề in chuyên dụng được liệt kê dưới đây.

# SuperfastPython.comthread inthreads:

    thread.start()thread.start()

# Ví dụ về chủ đề in và hàng đợi an toàn chủ đề

# SuperfastPython.comthread in threads:

    thread.join()thread.join()

# Ví dụ về chủ đề in và hàng đợi an toàn chủ đề

từ nhập ngẫu nhiên ngẫu nhiên

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

từ luồng nhập luồng

từ hàng đợi hàng đợiprint(), which makes it thread-safe.

# Nhiệm vụ cho chủ đề in

Máy in def (Hàng đợi):

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

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# in

# Nhiệm vụ cho các chủ đề công nhân

nhiệm vụ def (số, hàng đợi):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo số ngẫu nhiên trong khoảng từ 0 đến 1

& nbsp; & nbsp; & nbsp; & nbsp;# khối

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

& nbsp; & nbsp; & nbsp; & nbsp; hàng đợi.put (f'thread {number} got {value}. ')

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

# Bắt đầu chủ đề

...

Inthreads forthreads:

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

Chạy ví dụ đầu tiên tạo ra hàng đợi được chia sẻ.

  • Sau đó, nó tạo và định cấu hình luồng máy in và bắt đầu thực thi nó trong nền.

Tiếp theo, các luồng công nhân được tạo và cấu hình. Cuối cùng, luồng chính bắt đầu các luồng công nhân và chờ họ chấm dứt.

  • Mỗi luồng công nhân thực hiện nhiệm vụ của mình, tạo ra một số ngẫu nhiên và chặn. Sau đó, nó đặt các thông điệp của nó vào hàng đợi và chấm dứt.

Chủ đề máy in chạy trong một vòng lặp, mỗi lần lặp lấy một thông báo của hàng đợi và sau đó in nó. Bởi vì chỉ có một luồng máy in duy nhất, nên đó là luồng duy nhất gọi in (), làm cho nó an toàn.

  • Một ví dụ bị cắt ngắn của đầu ra được liệt kê dưới đây.
  • Lưu ý, kết quả cụ thể của bạn sẽ khác nhau mỗi khi chương trình được chạy do sử dụng các số ngẫu nhiên.
  • Chủ đề 41 có 0,0009937726430424565.my book!). 

Chủ đề 295 có 0,013061216765592465.

  • Chủ đề 490 có 0,002759410610238766.
    • Chủ đề 98 có 0,022733778225223267.
  • Chủ đề 510 có 0,00517634891577845.
    • Chủ đề 593 có 5.04963499099162E-05.
  • Chủ đề 297 có 0,01532270411186587.
    • Chủ đề 512 có 0,0052914236882953825.

Chủ đề 380 có 0,014671486167968983.

Chủ đề 517 có 0,008783940658370293.print() in a thread-safe manner.

Đọc thêm
Ask your questions in the comments below and I will do my best to answer.

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.