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. Show
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.
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:
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ư:
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
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
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
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
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
Đô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
Đô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.
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 Ví dụ về bản in không an toànTrong 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.
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.
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.
# Bắt đầu chủ đề Inthreads forthreads: # Chờ các chủ đề kết thúcflush” argument to True, requiring that the stream always flush messages.
# Bắt đầu chủ đề
# 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.
# Đị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.
# Ví dụ về in không an toàn cho chủ đềprint() to be protected by the lock using the context manager interface.
# 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 ().
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.
# 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.
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.
& 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.
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.
& 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().
# 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‘.
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:
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ố.
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.
# 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):
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ẻ.
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.
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.
Chủ đề 295 có 0,013061216765592465.
Chủ đề 380 có 0,014671486167968983.Chủ đề 517 có 0,008783940658370293.print() in a thread-safe manner. Đọ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. |