Hướng dẫn can a thread return a value python? - một chuỗi có thể trả về một giá trị python không?

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.

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
0 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()

Làm thế nào để có được giá trị & nbsp; 'foo' & nbsp; được trả về từ luồng như được hiển thị bên dưới?

from threading import Thread

def foo(bar):
    print 'hello {}'.format(bar)
    return 'foo'

thread = Thread(target=foo, args=('world!',))
thread.start()
ret = thread.join()
print ret

& nbsp; returns & nbsp; không có trong trường hợp trên.

Cảm ơn đã giúp đỡ!

Hướng dẫn can a thread return a value python? - một chuỗi có thể trả về một giá trị python không?
Ngày 3 tháng 12 năm 2018in Pythonby • & NBSP; 2.080 điểm EditedDec 19, 2018by Anirudh • 97.067 lượt xem in Python by
• 2,080 points

edited Dec 19, 2018 by Anirudh 97,067 views

3 Câu trả lời cho câu hỏi này.

Bạn không cần thay đổi mã hiện tại của mình:

import Queue
from threading import Thread

def foo(bar):
    print 'hello {0}'.format(bar)
    return 'foo'

que = Queue.Queue()

t = Thread(target=lambda q, arg1: q.put(foo(arg1)), args=(que, 'world!'))
t.start()
t.join()
result = que.get()
print result

Nó cũng có thể dễ dàng điều chỉnh theo môi trường đa luồng. Kiểm tra điều này dưới đây:

import Queue
from threading import Thread

def foo(bar):
    print 'hello {0}'.format(bar)
    return 'foo'

que = Queue.Queue()
threads_list = list()

t = Thread(target=lambda q, arg1: q.put(foo(arg1)), args=(que, 'world!'))
t.start()
threads_list.append(t)

# Add more threads here
...
threads_list.append(t2)
...
threads_list.append(t3)
...

# Join all the threads
for t in threads_list:
    t.join()

# Check thread's return value
while not que.empty():
    result = que.get()
    print result

Hy vọng điều này sẽ giúp, & nbsp;

Nếu bạn là người mới bắt đầu và cần biết thêm về Python, thì bạn nên tham gia Chứng nhận & NBSP; Python & NBSP; khóa học hôm nay.

Thanks!

Hướng dẫn can a thread return a value python? - một chuỗi có thể trả về một giá trị python không?
Đã trả lời ngày 3 tháng 12 năm 2018by Nymeria • & NBSP; 3.560 điểm EditedDec 19, 2018by Nymeria Dec 3, 2018 by Nymeria
• 3,560 points

edited Dec 19, 2018 by Nymeria

Các câu hỏi liên quan trong Python

Những hạn chế của việc xâu chuỗi trong Python là gì?

Trên thực tế, một quá trình Python không thể chạy các luồng song song nhưng nó có thể chạy chúng đồng thời thông qua chuyển đổi ngữ cảnh trong các hoạt động ràng buộc I/O.Hạn chế này thực sự được thực thi bởi Gil.Khóa thông dịch viên toàn cầu Python (GIL) ngăn chặn các luồng trong cùng một quy trình được thực hiện cùng một lúc.cannot run threads in parallel but it can run them concurrently through context switching during I/O bound operations. This limitation is actually enforced by GIL. The Python Global Interpreter Lock (GIL) prevents threads within the same process to be executed at the same time.

Hàm nào được sử dụng để trả về một giá trị từ chủ đề trở lại?

Hàm foo bên dưới trả về một chuỗi 'foo'.foo below returns a string 'foo' .

Các chủ đề python có chia sẻ các biến không?

Như đã đề cập trước đó, mỗi luồng chia sẻ cùng một không gian bộ nhớ.Đó là, các biến trong chương trình được chia sẻ bởi tất cả các luồng và không thể truy cập theo cách bạn thường truy cập một biến.the variables in the program are shared by all the threads and cannot be accessed the way you would normally access a variable.

Bạn có thể luồn một chức năng trong Python không?

Việc xâu chuỗi trong Python rất đơn giản. Nó cho phép bạn quản lý các luồng đồng thời thực hiện công việc cùng một lúc.Thư viện được gọi là chủ đề của Google, bạn tạo các đối tượng của chủ đề và chúng chạy các chức năng mục tiêu cho bạn.Bạn có thể bắt đầu hàng trăm chủ đề sẽ hoạt động song song. It allows you to manage concurrent threads doing work at the same time. The library is called “threading“, you create “Thread” objects, and they run target functions for you. You can start potentially hundreds of threads that will operate in parallel.