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.

Phần chính là thêm *args và ** kwargs để tham gia () để xử lý thời gian chờ

class threadWithReturn(Thread):
    def __init__(self, *args, **kwargs):
        super(threadWithReturn, self).__init__(*args, **kwargs)
        
        self._return = None
    
    def run(self):
        if self._Thread__target is not None:
            self._return = self._Thread__target(*self._Thread__args, **self._Thread__kwargs)
    
    def join(self, *args, **kwargs):
        super(threadWithReturn, self).join(*args, **kwargs)
        
        return self._return

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ý timeout arg. Nhưng cũng có một trường hợp góc mà bạn nên biết về các trường hợp khi bạn có (1) hàm đích có thể trả về None và (2) bạn cũng vượt qua timeout arg để tham gia (). Vui lòng xem "Kiểm tra 4" để hiểu trường hợp góc này.

Lớp ThreadWithReturn hoạt động với PY2 và PY3:

import sys
from threading import Thread
from builtins import super    # https://stackoverflow.com/a/30159479

_thread_target_key, _thread_args_key, _thread_kwargs_key = (
    ('_target', '_args', '_kwargs')
    if sys.version_info >= (3, 0) else
    ('_Thread__target', '_Thread__args', '_Thread__kwargs')
)

class ThreadWithReturn(Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._return = None
    
    def run(self):
        target = getattr(self, _thread_target_key)
        if target is not None:
            self._return = target(
                *getattr(self, _thread_args_key),
                **getattr(self, _thread_kwargs_key)
            )
    
    def join(self, *args, **kwargs):
        super().join(*args, **kwargs)
        return self._return

Một số thử nghiệm mẫu được hiển thị dưới đây:

import time, random

# TEST TARGET FUNCTION
def giveMe(arg, seconds=None):
    if not seconds is None:
        time.sleep(seconds)
    return arg

# TEST 1
my_thread = ThreadWithReturn(target=giveMe, args=('stringy',))
my_thread.start()
returned = my_thread.join()
# (returned == 'stringy')

# TEST 2
my_thread = ThreadWithReturn(target=giveMe, args=(None,))
my_thread.start()
returned = my_thread.join()
# (returned is None)

# TEST 3
my_thread = ThreadWithReturn(target=giveMe, args=('stringy',), kwargs={'seconds': 5})
my_thread.start()
returned = my_thread.join(timeout=2)
# (returned is None) # because join() timed out before giveMe() finished

# TEST 4
my_thread = ThreadWithReturn(target=giveMe, args=(None,), kwargs={'seconds': 5})
my_thread.start()
returned = my_thread.join(timeout=random.randint(1, 10))

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.

returned is None có nghĩa là:

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

# TEST 4
my_thread = ThreadWithReturn(target=giveMe, args=(None,), kwargs={'seconds': 5})
my_thread.start()
returned = my_thread.join(timeout=random.randint(1, 10))

if my_thread.isAlive():
    # returned is None because join() timed out
    # this also means that giveMe() is still running in the background
    pass
    # handle this based on your app's logic
else:
    # join() is finished, and so is giveMe()
    # BUT we could also be in a race condition, so we need to update returned, just in case
    returned = my_thread.join()

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ời
  • 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.
  • Xem: Chương: 14: Chủ đề và quy trình
  • từ thời gian nhập vào giấc ngủ
  • Python Threading: Hướng dẫn hoàn chỉnh

Xem: Chương 12: Đồng thời

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.

Xem: Chương: 14: Chủ đề và quy trìnhthreading.Thread class.

Takeaways

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

Ảnh của Harley-Davidson trên unplash

  • Bạn có thể trả về các giá trị từ một luồng thông qua các biến thể hiện trên lớp luồng.thread hoặc thông qua các biến toàn cầu.
  • Trong hướng dẫn này, bạn sẽ khám phá cách trả về các giá trị từ một luồng.
  • Bắt đầu nào.

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.

  • Ảnh của Harley-Davidson trên unplash
  • Lưu trữ dữ liệu trong các biến toàn cầu.

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.

# Chủ đề tùy chỉnh

classCustomThread(Thread):CustomThread(Thread):

& nbsp; & nbsp; & nbsp; & nbsp;# Constructor# constructor

& nbsp; & nbsp; & nbsp; & nbsp; def __init __ (self):def __init__(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# execute the base constructor

        Thread.__init__(self)Thread.__init__(self)

& nbsp; & nbsp; & nbsp; & nbsp;# funct# function executed in a new thread

& nbsp; & nbsp; & nbsp; & nbsp; def chạy (self):def run(self):

# ...

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.

.....

# Phạm vi chính xác biến toàn cầu

Globaldatadata

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

Ví dụ về việc trả về một giá trị từ một luồng

Chú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.

# Chủ đề tùy chỉnh

classCustomThread(Thread):CustomThread(Thread):

& nbsp; & nbsp; & nbsp; & nbsp;# Constructor# constructor

& nbsp; & nbsp; & nbsp; & nbsp; def __init __ (self):def __init__(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# execute the base constructor

        Thread.__init__(self)Thread.__init__(self)

& nbsp; & nbsp; & nbsp; & nbsp;# funct# set a default value

        self.value=Noneself.value=None

& nbsp; & nbsp; & nbsp; & nbsp; def chạy (self):run() method on threading.Thread to execute some custom code.

# ...value” instance variable.

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.run(self):

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.# block for a moment

    sleep(1)sleep(1)

...# store data in an instance variable

# Phạm vi chính xác biến toàn cầuself.value ='Hello from a new thread'

Globaldata

# Chủ đề tùy chỉnh

classCustomThread(Thread):CustomThread(Thread):

& nbsp; & nbsp; & nbsp; & nbsp;# Constructor# constructor

& nbsp; & nbsp; & nbsp; & nbsp; def __init __ (self):def __init__(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# execute the base constructor

        Thread.__init__(self)Thread.__init__(self)

& nbsp; & nbsp; & nbsp; & nbsp;# funct# set a default value

        self.value=Noneself.value=None

& nbsp; & nbsp; & nbsp; & nbsp;# funct# function executed in a new thread

& nbsp; & nbsp; & nbsp; & nbsp; def chạy (self):def run(self):

# ...# block for a moment

        sleep(1)sleep(1)

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.# store data in an instance variable

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.self.value ='Hello from a new thread'

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.

.....

# Phạm vi chính xác biến toàn cầu

thread=CustomThread()=CustomThread()

Globaldata

thread.start().start()

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 đó.

.....

# Phạm vi chính xác biến toàn cầu

thread.join().join()

Globaldata

Chúng tôi có thể truy cập trực tiếp và báo cáo giá trị.

.....

# Nhận giá trị được trả về từ luồng

data=thread.value=thread.value

print(data)(data)

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.

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

# 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ủtime import sleep

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

# Chủ đề tùy chỉnh

classCustomThread(Thread):CustomThread(Thread):

& nbsp; & nbsp; & nbsp; & nbsp;# Constructor# constructor

& nbsp; & nbsp; & nbsp; & nbsp; def __init __ (self):def __init__(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# execute the base constructor

        Thread.__init__(self)Thread.__init__(self)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# set a default value

        self.value=Noneself.value=None

& nbsp; & nbsp; & nbsp; & nbsp;# funct# function executed in a new thread

& nbsp; & nbsp; & nbsp; & nbsp; def chạy (self):def run(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# block for a moment

        sleep(1)sleep(1)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ dữ liệu trong một biến thể hiện# store data in an instance variable

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;self.value='Hello from a new thread'

# Tạo một chủ đề mới

thread=CustomThread()=CustomThread()

# Bắt đầu chủ đề

thread.start().start()

# Đợi cho chủ đề kết thúc

thread.join().join()

# Nhận giá trị được trả về từ luồng

data=thread.value =thread.value

print(data)(data)

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

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ dữ liệu trong một biến thể hiện

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;__init__(self):

# Tạo một chủ đề mới# execute the base constructor

    Thread.__init__(self)Thread.__init__(self)

# Bắt đầu chủ đề# set a default values

    self.value1=Noneself.value1 =None

    self.value2=Noneself.value2=None

    self.value3=Noneself.value3=None

# Đợi cho chủ đề kết thúcrun() method to set values in each instance variable.

Chạy ví dụ đầu tiên tạo ra phiên bản luồng mới và bắt đầu thực thi.

Các luồng chính chặn cho đến khi luồng mới hoàn thành, sau đó truy cập vào biến thể hiện và báo cáo giá trị của nó.run(self):

Điều này mô phỏng một giá trị trả về đơn đơn giản từ luồng mới.# block for a moment

    sleep(1)sleep(1)

Tiếp theo, hãy để Lôi nhìn vào cách chúng ta có thể trả về nhiều giá trị từ một luồng.# store data in an instance variable

Khóa học luồng python miễn phíself.value1 ='Hello from a new thread'

    self.value2=99self.value2=99

    self.value3=Falseself.value3=False

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.

.....

Khám phá cách sử dụng mô -đun luồng Python bao gồm cách tạo và khởi động các luồng mới và cách sử dụng khóa và semaphores mutex

print(thread.value1)(thread.value1)

print(thread.value2)(thread.value2)

print(thread.value3)(thread.value3)

Tìm hiểu thêm & NBSP;

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

# SuperfastPython.com

Ví dụ về trả về nhiều giá trị từ một luồng

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

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

# Chủ đề tùy chỉnh

classCustomThread(Thread):CustomThread(Thread):

& nbsp; & nbsp; & nbsp; & nbsp;# Constructor# constructor

& nbsp; & nbsp; & nbsp; & nbsp; def __init __ (self):def __init__(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# execute the base constructor

        Thread.__init__(self)Thread.__init__(self)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# set a default values

        self.value1=Noneself.value1=None

        self.value2=Noneself.value2=None

        self.value3=Noneself.value3 =None

& nbsp; & nbsp; & nbsp; & nbsp;# funct# function executed in a new thread

& nbsp; & nbsp; & nbsp; & nbsp; def chạy (self):def run(self):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# block for a moment

        sleep(1)sleep(1)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ dữ liệu trong một biến thể hiện# store data in an instance variable

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;self.value1='Hello from a new thread'

        self.value2=99self.value2=99

        self.value3=Falseself.value3 =False

# Tạo một chủ đề mới

thread=CustomThread()=CustomThread()

# Bắt đầu chủ đề

thread.start().start()

# Đợi cho chủ đề kết thúc

thread.join().join()

# Báo cáo tất cả các giá trị được trả về từ một luồng

print(thread.value1)(thread.value1)

print(thread.value2)(thread.value2)

print(thread.value3)(thread.value3)

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.

Xin chào từ một chủ đề mới

99

Sai

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ầu

Chú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ức năng được thực thi trong một luồng mới

nhiệm vụ def ():task():

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(1)sleep(1)

& nbsp; & nbsp; & nbsp; & nbsp;# chính xác phạm vi biến toàn cầu# correctly scope the global variable

    globaldataglobal data

& nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ dữ liệu trong biến toàn cầu# store data in the global variable

& nbsp; & nbsp; & nbsp; & nbsp; data = 'Xin chào từ một chủ đề mới'data='Hello from a new thread'

Chủ đề chính sẽ xác định biến toàn cầu và đặt giá trị mặc định.

.....

# Xác định biến toàn cầu

data=None=None

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.

.....

# Tạo một chủ đề mới

thread=Thread(target=task)=Thread(target=task)

# Xác định biến toàn cầu

.....

# Bắt đầu chủ đề

thread.start().start()

# Đợi cho chủ đề kết thúc

thread.join().join()

# Báo cáo tất cả các giá trị được trả về từ một luồng

.....

# Xác định biến toàn cầu

print(data)(data)

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.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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ầutime import sleep

Kế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.threading import Thread

# chức năng được thực thi trong một luồng mới

nhiệm vụ def ():task():

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(1)sleep(1)

& nbsp; & nbsp; & nbsp; & nbsp;# chính xác phạm vi biến toàn cầu# correctly scope the global variable

    globaldataglobaldata

& nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ dữ liệu trong biến toàn cầu# store data in the global variable

& nbsp; & nbsp; & nbsp; & nbsp; data = 'Xin chào từ một chủ đề mới'data='Hello from a new thread'

# Xác định biến toàn cầu

data=None=None

# Tạo một chủ đề mới

thread=Thread(target=task)=Thread(target=task)

# Bắt đầu chủ đề

thread.start().start()

# Đợi cho chủ đề kết thúc

thread.join().join()

# Xác định biến toàn cầu

print(data)(data)

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ầu

Kế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

  • # 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ạ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.

  • Chủ đề mới sau đó lưu trữ dữ liệu so với biến toàn cầu, chắc chắn chỉ định rõ ràng phạm vi để tránh nhầm lẫn trong việc đọc mã và các lỗi có thể có trong tương lai.
  • Chủ đề chính chặn cho đến khi luồng mới kết thúc sau đó báo cáo giá trị trả về mô phỏng được lưu trữ trong biến toàn cầu.
  • Đọc thêmmy book!). 

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.

  • API
    • Chủ đề - song song dựa trên luồng
  • Hướng dẫn
    • Python Threading: Hướng dẫn hoàn chỉnh
  • Sách
    • Bảng xác định API mô -đun chủ đề

Chủ đề câu hỏi phỏng vấn API

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

Cookbook Python, David Beazley và Brian Jones, 2013.