Hướng dẫn reuse thread python - sử dụng lại python chuỗi

Tôi đã tìm thấy một cách (hacky) để sử dụng lại một đối tượng luồng. Bằng cách tạo một lớp con và thực hiện phương thức đặt lại, trong trường hợp bạn chỉ muốn thay đổi các đối số của hàm mà luồng được "liên kết".

class ReusableThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self,*args, **kwargs)
        self._default_args = self._target, self._args, self._kwargs

    def run(self, *args, **kwargs):
        super().run()
        self.reset()
        
    def reset(self, *args, **kwargs):
        self._target = self._default_args[0]
        self._args = args or self._default_args[1]
        self._kwargs = kwargs or self._default_args[2]

Trong vỏ trăn:

>>> r  = ReusableThread(target=print, args=("banana",))
>>> r.start()
banana
>>> r.reset(("banana", "apple"), "kiwi", sep='\n', end="<<<\n")
>>> r.run()
('banana', 'apple')
kiwi<<<
>>>

Chạy ví dụ đầu tiên tạo ra luồng và chạy nó như trước.

Chủ đề chính tham gia vào chủ đề mới cho đến khi nó chấm dứt.

Chủ đề chính sau đó tạo ra một thể hiện luồng mới với cùng một cấu hình, khởi động nó và tham gia nó. Như chúng tôi mong đợi, chủ đề mới này thực thi mà không gặp sự cố.

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

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

from threading import Thread, Event

class ReusableThread(Thread)

    def __init__(self, target, args):
        self._startSignal = Event()
        self._oneRunFinished = Event()
        self._finishIndicator = False
        self._callable = target
        self._callableArgs = args

        Thread.__init__(self)

    def restart(self)
        self._startSignal.set()

    def run(self)

        self.restart()
        while(True):    
            
            self._startSignal.wait()

            self._startSignal.clear()

            if(self._finishIndicator):
                self._oneRunFinished.set()
                return
            
            
            self._callable(*self._callableArgs)

            
            self._oneRunFinished.set()

    def join(self)
        self._oneRunFinished.wait()
        self._oneRunFinished.clear()

    def finish(self):
        self._finishIndicator = True
        self.restart()
        self.join()

API

Chủ đề - song song dựa trên luồng

# Bắt đầu chủ đề

Bạn không thể khởi động lại một luồng trong Python, thay vào đó bạn phải tạo và bắt đầu một luồng mới với cùng một cấu hình.cannot restart a thread in Python, instead you must create and start a new thread with the same configuration.

Trong hướng dẫn này, bạn sẽ khám phá cách mô phỏng khởi động lại một luồng trong Python.

Bắt đầu nào.

  • Cần khởi động lại một luồng
  • Cách khởi động lại một luồng
  • Ví dụ về khởi động lại một luồng bị chấm dứt
  • Ví dụ về việc khởi động lại một luồng với một thể hiện mớ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 Guude:

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

Có thể có những trường hợp các chủ đề mới của chúng tôi bị chấm dứt, thông thường bằng cách hoàn thành việc thực thi của họ hoặc bằng cách gây ra lỗi và chúng tôi cần khởi động lại chúng.

Điều này có thể là vì nhiều lý do như:

  • Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.
  • Chủ đề là một nhiệm vụ nền Daemon mà chúng tôi muốn luôn chạy.
  • Chủ đề đang thực hiện một tác vụ có thể được khởi động lại từ điểm kiểm tra.

Một chủ đề có thể được khởi động lại trong Python và nếu có thì làm thế nào?

Cách khởi động lại một luồng

Ví dụ về khởi động lại một luồng bị chấm dứt

Ví dụ về việc khởi động lại một luồng với một thể hiện mới

Đọc thêm

Takeawaysrun() function.

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.start() function on a terminated thread will result in a RuntimeError indicating that threads can only be started once.

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.start() function.

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

Ví dụ về khởi động lại một luồng bị chấm dứt

Ví dụ về việc khởi động lại một luồng với một thể hiện mới

Đọc thêmRuntimeError.

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

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

    sleep(1)sleep(1)

Bạn có thể tìm hiểu thêm về các chủ đề Python trong Guude:# report a message

Chủ đề trong Python: Hướng dẫn hoàn chỉnhprint('Hello from the new thread')

Có thể có những trường hợp các chủ đề mới của chúng tôi bị chấm dứt, thông thường bằng cách hoàn thành việc thực thi của họ hoặc bằng cách gây ra lỗi và chúng tôi cần khởi động lại chúng.threading.Thread class and configure it to execute our custom task() function via the “target” keyword.

Điều này có thể là vì nhiều lý do như:..

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

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

Chủ đề là một nhiệm vụ nền Daemon mà chúng tôi muốn luôn chạy.run() function and in turn call our custom task() function.

Điều này có thể là vì nhiều lý do như:..

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

thread.start().start()

Chủ đề là một nhiệm vụ nền Daemon mà chúng tôi muốn luôn chạy.

Điều này có thể là vì nhiều lý do như:..

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

thread.join().join()

Chủ đề là một nhiệm vụ nền Daemon mà chúng tôi muốn luôn chạy.

Điều này có thể là vì nhiều lý do như:..

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

thread.start().start()

Chủ đề là một nhiệm vụ nền Daemon mà chúng tôi muốn luôn chạy.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Chủ đề đang thực hiện một tác vụ có thể được khởi động lại từ điểm kiểm tra.

Một chủ đề có thể được khởi động lại trong Python và nếu có thì làm thế nào?

Chủ đề Python không thể được khởi động lại hoặc tái sử dụng.time import sleep

Trên thực tế, đây có lẽ là một hạn chế của các khả năng của các chủ đề được cung cấp bởi hệ điều hành cơ bản.threading import Thread

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

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

    sleep(1)sleep(1)

Bạn có thể tìm hiểu thêm về các chủ đề Python trong Guude:# report a message

Chủ đề trong Python: Hướng dẫn hoàn chỉnhprint('Hello from the new thread')

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

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

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

thread.start().start()

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

thread.join().join()

Chủ đề thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ.

thread.start().start()

Chủ đề là một nhiệm vụ nền Daemon mà chúng tôi muốn luôn chạy.

Chủ đề đang thực hiện một tác vụ có thể được khởi động lại từ điểm kiểm tra.

Một chủ đề có thể được khởi động lại trong Python và nếu có thì làm thế nào?

Kết quả là một thời gian chạy, như chúng tôi mong đợi.RuntimeError, as we expected.

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

Traceback (cuộc gọi gần đây nhất cuối cùng):

...

Tăng RunTimeError ("Chỉ có thể bắt đầu một lần")

RunTimEError: Chủ đề chỉ có thể được bắt đầu một lần

Điều này nhấn mạnh rằng thực sự chúng ta không thể gọi phương thức start () (ví dụ: khởi động lại) một luồng đã chấm dứt.start() method (e.g. restart) a thread that has already terminated.

Tiếp theo, hãy để Lôi nhìn vào một cách tiếp cận thay thế để tạo một thể hiện chủ đề mới.


Khóa học luồng python miễn phí

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

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


Ví dụ về việc khởi động lại một luồng với một thể hiện mới

Chúng ta có thể mô phỏng khởi động lại một luồng bằng cách tạo một luồng mới với cùng một cấu hình và bắt đầu nó thay thế.

Một chủ đề mới có cùng cấu hình có thể được tạo. Điều này liên quan đến các đối số cho hàm tạo như:

  • Tên chủ đề.
  • Hàm mục tiêu.
  • Đối số chức năng đích (tuple hoặc dict).
  • Daemon hay không.

Nếu chúng tôi xem lại mã cho lớp luồng.threading.Thread class, we can see that arguments are stored internally within the thread, although are private with names like _name, _target, _args, and so on.

Thay vì cố gắng truy cập các thuộc tính riêng này, thay vào đó chúng ta có thể tạo một thể hiện luồng mới và chỉ định các đối số cho hàm tạo theo cách thủ công.

.....

Tăng RunTimeError ("Chỉ có thể bắt đầu một lần")

thread2=Thread(target=task)=Thread(target=task)

RunTimEError: Chủ đề chỉ có thể được bắt đầu một lần

.....

Tăng RunTimeError ("Chỉ có thể bắt đầu một lần")

thread2.start().start()

RunTimEError: Chủ đề chỉ có thể được bắt đầu một lần

thread2.join().join()

Điều này nhấn mạnh rằng thực sự chúng ta không thể gọi phương thức start () (ví dụ: khởi động lại) một luồng đã chấm dứt.

Tiếp theo, hãy để Lôi nhìn vào một cách tiếp cận thay thế để tạo một thể hiện chủ đề mới.

Khóa học luồng python miễn phí

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.create_thread()

returnThread(target=task)Thread(target=task)

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

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

Ví dụ về việc khởi động lại một luồng với một thể hiện mới

Chúng ta có thể mô phỏng khởi động lại một luồng bằng cách tạo một luồng mới với cùng một cấu hình và bắt đầu nó thay thế.

Một chủ đề mới có cùng cấu hình có thể được tạo. Điều này liên quan đến các đối số cho hàm tạo như:time import sleep

Tên chủ đề.threading import Thread

Hàm mục tiêu.

Đối số chức năng đích (tuple hoặc dict).task():

Daemon hay không.# block for a moment

    sleep(1)sleep(1)

Nếu chúng tôi xem lại mã cho lớp luồng.# report a message

Thay vì cố gắng truy cập các thuộc tính riêng này, thay vào đó chúng ta có thể tạo một thể hiện luồng mới và chỉ định các đối số cho hàm tạo theo cách thủ công.print('Hello from the new thread')

# Tạo một luồng mới với cùng một cấu hình

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

Sau đó, bắt đầu và tham gia nó như trước đây.

thread.start().start()

# Bắt đầu chủ đề mới

thread.join().join()

Tăng RunTimeError ("Chỉ có thể bắt đầu một lần")

thread2=Thread(target=task)=Thread(target=task)

Tăng RunTimeError ("Chỉ có thể bắt đầu một lần")

thread2.start().start()

RunTimEError: Chủ đề chỉ có thể được bắt đầu một lần

thread2.join().join()

Điều này nhấn mạnh rằng thực sự chúng ta không thể gọi phương thức start () (ví dụ: khởi động lại) một luồng đã chấm dứt.

Tiếp theo, hãy để Lôi nhìn vào một cách tiếp cận thay thế để tạo một thể hiện chủ đề mới.

Khóa học luồng python miễn phí

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

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

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

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

  • Ví dụ về việc khởi động lại một luồng với một thể hiện mới

Chúng ta có thể mô phỏng khởi động lại một luồng bằng cách tạo một luồng mới với cùng một cấu hình và bắt đầu nó thay thế.

  • Một chủ đề mới có cùng cấu hình có thể được tạo. Điều này liên quan đến các đối số cho hàm tạo như:

Tên chủ đề.

  • Hàm mục tiêu.
  • Đối số chức năng đích (tuple hoặc dict).
  • Daemon hay không.my book!). 

Nếu chúng tôi xem lại mã cho lớp luồng.

Thay vì cố gắng truy cập các thuộc tính riêng này, thay vào đó chúng ta có thể tạo một thể hiện luồng mới và chỉ định các đối số cho hàm tạo theo cách thủ công.

# Tạo một luồng mới với cùng một cấu hình
Ask your questions in the comments below and I will do my best to answer.

Sau đó, bắt đầu và tham gia nó như trước đây.