Hướng dẫn get the return value from a thread python - lấy giá trị trả về từ chuỗi python
Tôi đã đánh cắp câu trả lời của Kindall và làm sạch nó chỉ một chút. Show Phần chính là thêm *args và ** kwargs để tham gia () để xử lý thời gian chờ
Cập nhật câu trả lời dưới đây Đây là câu trả lời được nâng cấp phổ biến nhất của tôi, vì vậy tôi quyết định cập nhật với mã sẽ chạy trên cả PY2 và PY3. Ngoài ra, tôi thấy nhiều câu trả lời cho câu hỏi này cho thấy sự thiếu hiểu biết về Thread.join (). Một số hoàn toàn không xử lý Lớp ThreadWithReturn hoạt động với PY2 và PY3:
Một số thử nghiệm mẫu được hiển thị dưới đây:
Bạn có thể xác định trường hợp góc mà chúng ta có thể gặp phải với Test 4 không? Vấn đề là chúng tôi hy vọng Giveme () sẽ trả về không (xem Bài kiểm tra 2), nhưng chúng tôi cũng mong đợi tham gia () sẽ không trả lại nếu nó hết lần.
(1) Đó là những gì giveme () trở lại, hoặc (2) Tham gia () hết thời gian Ví dụ này là tầm thường vì chúng ta biết rằng Giveme () sẽ luôn trả về không. Nhưng trong trường hợp trong thế giới thực (trong đó mục tiêu có thể trả lại một cách hợp pháp hoặc một cái gì đó khác), chúng tôi muốn kiểm tra rõ ràng những gì đã xảy ra. Dưới đây là cách giải quyết trường hợp góc này: Python Threading Jump-Start, Jason Brownlee, 2022 (Sách của tôi!). & NBSP;return values from a thread via instance variables on the threading.Thread class or via global variables. Tôi cũng đề xuất các chương cụ thể trong các cuốn sách sau: Cookbook Python, David Beazley và Brian Jones, 2013.
Xem: Chương 12: Đồng thờiPython hiệu quả, Brett Slatkin, 2019. Xem: Chương 7: Đồng thời và song song Python trong A Nutshell, Alex Martelli, et al., 2017. Xem: Chương: 14: Chủ đề và quy trìnhthreading.Thread class. Takeaways
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 Harley-Davidson trên unplash
Cần trả về giá trị từ một luồng Python hiệu quả, Brett Slatkin, 2019.Xem: Chương 7: Đồng thời và song song Python trong A Nutshell, Alex Martelli, et al., 2017.start() method on a thread calls the run() method of the thread that executes our code in a new thread of execution. The run() method in turn may call a target function, if configured. Xem: Chương: 14: Chủ đề và quy trìnhstart() method does not block, instead it returns immediately and does not return a value. The run method also does not return a value. Takeawaysjoin() method also does not return a value. Bây giờ bạn đã biết cách trả về các giá trị từ một chủ đề trong 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.
Cách tiếp cận ưa thích là mở rộng lớp học. Chủ đề và lưu trữ dữ liệu trả về dưới dạng các biến thể hiện.threading.Thread class and store return data as instance variables. Điều này liên quan đến việc xác định một lớp mới mở rộng luồng. Chủ đề và xác định một hàm tạo gọi là hàm tạo cha mẹ.threading.Thread and defines a constructor that calls the parent constructor. Phương thức Run () có thể được xác định thực thi mã tùy chỉnh trong một luồng mới và lưu trữ dữ liệu dưới dạng các biến thể hiện.run() method can be defined that executes the custom code in a new thread and stores data as instance variables.
Một cách tiếp cận khác là lưu trữ dữ liệu từ luồng trong một biến toàn cầu. Tất cả các chủ đề sẽ có thể truy cập các biến toàn cầu. Đây có thể là một cách tiếp cận ưa thích nếu bạn đã thực thi chức năng trong một luồng mới và cần lấy dữ liệu ra khỏi luồng. Phạm vi của biến toàn cầu có thể được thực hiện rõ ràng và dữ liệu có thể được lưu trữ trực tiếp.
Nguy cơ của cả hai phương pháp là có thể có một điều kiện chủng tộc giữa dữ liệu lưu trữ luồng mới trong một biến thể hiện hoặc biến toàn cầu và một hoặc nhiều luồng khác đọc dữ liệu đó. Giải pháp có thể là bảo vệ dữ liệu bằng luồng.lock, để sử dụng luồngthreading.Lock, to use a threading.Event to flag that the return data is available, or to use a threading.Condition to notify threads that the data is ready. Một cách tiếp cận đơn giản hơn là chỉ cần chờ đợi chủ đề mới chấm dứt. Bây giờ chúng ta đã biết cách trả về các giá trị từ một chủ đề, hãy để xem xét một số ví dụ đã làm việc. Bị nhầm lẫn bởi API mô -đun luồng? Tải xuống bảng cheat pdf miễn phí của tôi Ví dụ về việc trả về một giá trị từ một luồngChúng ta có thể khám phá cách mô phỏng trả về một giá trị duy nhất từ một luồng thông qua một biến thể hiện. Trong ví dụ này, chúng tôi sẽ xác định một lớp mới mở rộng lớp luồng. Chủ đề chính sau đó sẽ truy cập giá trị trả về.threading.Thread class, define the instance variable in the constructor and set it to None, then override the run() function with custom code and set the instance variable. The main thread will then access the return value. Đầu tiên, hãy để xác định lớp mới mở rộng lớp luồng. Chủ đề và xác định một hàm tạo gọi là hàm tạo cha mẹ.Threading.Thread class and defines a constructor that calls the parent constructor. Trong hàm tạo, chúng tôi cũng sẽ xác định một thuộc tính công cộng mới có tên là giá trị và đặt nó thành giá trị không có.value” and set it to the value None.
& nbsp; & nbsp; & nbsp; & nbsp; def chạy (self):run() method on threading.Thread to execute some custom code. # ...value” instance variable.
Globaldata
Phạm vi của biến toàn cầu có thể được thực hiện rõ ràng và dữ liệu có thể được lưu trữ trực tiếp.start() function to start executing it.
Nguy cơ của cả hai phương pháp là có thể có một điều kiện chủng tộc giữa dữ liệu lưu trữ luồng mới trong một biến thể hiện hoặc biến toàn cầu và một hoặc nhiều luồng khác đọc dữ liệu đó.
Globaldata Chúng tôi có thể truy cập trực tiếp và báo cáo giá trị.
Kết hợp điều này lại với nhau, ví dụ hoàn chỉnh về việc trả về một giá trị từ một luồng được liệt kê bên dưới.
Kết hợp điều này lại với nhau, ví dụ hoàn chỉnh về việc trả về một giá trị từ một luồng được liệt kê bên dưới. # SuperfastPython.com # Ví dụ về trả về một giá trị từ một luồng từ thời gian nhập vào giấc ngủ từ luồng nhập luồng # Chủ đề tùy chỉnh & nbsp; & nbsp; & nbsp; & nbsp;# Constructor & nbsp; & nbsp; & nbsp; & nbsp; def __init __ (self): & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# functthreading.Thread class. & nbsp; & nbsp; & nbsp; & nbsp; def chạy (self): & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;value1“, “value2“, and “value3“.
# Đợi cho chủ đề kết thúcrun() method to set values in each instance variable.
Tải xuống bảng gian lận API luồng của tôi và như một phần thưởng, bạn sẽ có quyền truy cập miễn phí vào khóa học email 7 ngày của tôi.
Tìm hiểu thêm & NBSP;
Chạy ví dụ tạo và chạy luồng mới. Các luồng chính chặn cho đến khi luồng mới đã chấm dứt và chúng tôi biết rằng các biến thể hiện đã được gán dữ liệu. Cuối cùng, luồng chính truy cập các biến thể hiện và báo cáo giá trị của chúng, mô phỏng nhiều giá trị trả về từ luồng mới.
Tiếp theo, hãy để Lôi nhìn vào cách chúng ta có thể trả về các giá trị từ một luồng thông qua một biến toàn cầu. Ví dụ về các giá trị trả về thông qua các biến toàn cầuChúng ta có thể khám phá cách chúng ta có thể sử dụng các biến toàn cầu để mô phỏng các giá trị trả về từ một luồng mới. Cách tiếp cận này có thể được ưa thích nếu chúng ta đã có một chức năng mà chúng ta đang chạy trong một luồng mới. Đầu tiên, chúng ta có thể xác định chức năng tác vụ mục tiêu mới để chạy trong một luồng mới. Hàm sẽ chặn trong giây lát, sau đó khai báo phạm vi của biến toàn cầu và gán cho nó một giá trị.
Chủ đề chính sẽ xác định biến toàn cầu và đặt giá trị mặc định.
Sau đó, chúng ta có thể tạo một phiên bản mới. Chủ đề mới và yêu cầu nó gọi hàm Task () mới của chúng ta bằng cách chỉ định nó trong biến Target Target của Trình xây dựng.threading.Thread instance and have it call our new task() function by specifying it in the “target” variable of the constructor.
# Xác định biến toàn cầu
# Báo cáo tất cả các giá trị được trả về từ một luồng
Sau đó, chúng ta có thể tạo một phiên bản mới. Chủ đề mới và yêu cầu nó gọi hàm Task () mới của chúng ta bằng cách chỉ định nó trong biến Target Target của Trình xây dựng.
Sau đó, chúng ta có thể tạo một phiên bản mới. Chủ đề mới và yêu cầu nó gọi hàm Task () mới của chúng ta bằng cách chỉ định nó trong biến Target Target của Trình xây dựng. Chủ đề chính sau đó có thể bắt đầu luồng mới và tham gia nó, chặn cho đến khi luồng mới đã chấm dứt. Cuối cùng, một khi chúng ta biết chủ đề mới đã chấm dứt và biến toàn cầu đã được chỉ định bởi luồng mới, chúng ta có thể báo cáo giá trị của nó. # Báo cáo biến toàn cầuKết hợp điều này lại với nhau, ví dụ hoàn chỉnh về các giá trị trả về từ một chủ đề khác thông qua các biến toàn cầu được liệt kê dưới đây. # SuperfastPython.com
từ thời gian nhập vào giấc ngủ
Chạy ví dụ đầu tiên tạo ra luồng mới và bắt đầu nó, thực hiện chức năng mục tiêu tùy chỉnh của chúng tôi.
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ủ đề câu hỏi phỏng vấn APIPython Threading Jump-Start, Jason Brownlee, 2022 (Sách của tôi!). & NBSP; Tôi cũng đề xuất các chương cụ thể trong các cuốn sách sau: Cookbook Python, David Beazley và Brian Jones, 2013. |