Hướng dẫn passing arguments to thread python - truyền đối số cho chuỗi python

Tôi có

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
7 như hình dưới đây:
threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
7
as shown below:

def test(arg1, arg2=None, arg3=None):

Bây giờ, tôi cố gắng tạo một chủ đề bằng cách sử dụng

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
7 và chỉ cho nó
threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
9 và
import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()
0 nhưng không phải Arg3 như được hiển thị bên dưới:
threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
7
, and giving it only
threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
9
and
import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()
0
but not arg3 as shown below:

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()

Nhưng, tôi đã gặp lỗi cú pháp. Làm thế nào tôi có thể giải quyết lỗi để tôi có thể chuyển một đối số cho luồng là arg2?

Bài đăng này bao gồm những điều cơ bản về mô -đun luồng của Python. Chủ đề cho phép bạn chạy nhiều tác vụ cùng một lúc. Điều này cho phép bạn thực hiện một hoặc nhiều nhiệm vụ trong khi một tác vụ khác chạy.

  • Chủ đề là gì?
  • Luồng một phương pháp
    • Thông qua các lập luận
  • Luồng một lớp
    • Thông qua các lập luận
  • Luồng một lớp
    • Quản lý chủ đề của bạn
    • Đặt tên
    • Tham gia chủ đề
    • Nhận tất cả các chủ đề
    • Là một chủ đề còn sống?
  • Tại sao nó sẽ không làm cho tập lệnh của bạn chạy nhanh hơn
  • Trong hầu hết các trường hợp, việc xâu chuỗi mã đã tồn tại của bạn sẽ không làm cho nó chạy nhanh hơn. Các chủ đề Python được thiết kế để chạy nhiều tác vụ cùng một lúc, tuy nhiên, đây chỉ là trên một lõi CPU.

Chủ đề là gì?

Luồng một phương pháp

Thông qua các lập luận

Luồng một phương pháp

Thông qua các lập luận

import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()

Luồng một lớp

$ python threading_method.py

Hello World
Hello World
Hello World
Hello World

Quản lý chủ đề của bạn

Thông qua các lập luận

Luồng một lớp

import threading

def worker(number):
    print ('I am thread: ' + str(number) + '\n')

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker, args=(i,))
    thread_list.append(thread)
    thread.start()

Quản lý chủ đề của bạn

$ python threading_method_args.py

I am thread: 0
I am thread: 1
I am thread: 2
I am thread: 3

Đặt tên

Luồng một lớp

Việc luồng một lớp có thể khá hữu ích vì bạn có thể có nhiều phương thức cụ thể cho một luồng và việc giữ dữ liệu của bạn ở một nơi cụ thể dễ dàng hơn cho một luồng. Một ví dụ về luồng một lớp là:

import threading

class MyThread(threading.Thread):
    def __init__(self):
        super(MyThread, self).__init__()
        # Can setup other things before the thread starts
    def run(self):
        print ("Running")

thread_list = []
for i in range(4):
    thread = MyThread()
    thread_list.append(thread)
    thread.start()

Trong ví dụ này, tôi tạo một lớp mở rộng luồng. Tôi đã tạo phương thức khởi tạo với một cuộc gọi khởi tạo đến siêu lớp và phương thức chạy là những gì sẽ được chạy khi tôi gọi START (). Giống như lần trước tôi lặp 4 lần nhưng lần này tôi chỉ cần sử dụng

import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()
7 để thiết lập biến luồng. Điều này sẽ cung cấp đầu ra:run method which is what will be run when I call start(). Just like last time I loop 4 times but this time I only need to use
import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()
7 to set up the thread variable. This will provide the output:

RunningRunningRunningRunning

Xem làm thế nào tất cả các chuỗi được cùng nhau; Điều này cho thấy rằng tất cả chúng được in vào những thời điểm rất giống nhau và sau đó tất cả các dòng mới được đưa vào. Trong các ví dụ trên, điều này đã không xảy ra khi tôi buộc ký tự mới.

Lưu ý rằng nếu bạn không cần một phương thức khởi tạo, bạn có thể xóa nó hoàn toàn bao gồm cả cuộc gọi Super ().

Thông qua các lập luận

Để vượt qua các đối số, bạn chỉ cần sử dụng lớp như bình thường. Ví dụ:

import threading

class MyThread(threading.Thread):
    def __init__(self, number):
        super(MyThread, self).__init__()
        self.number = number
    def run(self):
        print (self.number)

thread_list = []
for i in range(4):
    thread = MyThread(i)
    thread_list.append(thread)
    thread.start()

Trong ví dụ này, tôi đã thêm một tham số vào lớp trong phương thức khởi tạo giống như bạn thường sẽ và lưu nó để nó có thể in nó sau. Sau đó, tôi chỉ cần chuyển một biến cho lớp sẽ được in. Điều này sẽ xuất hiện:

Giống như lần trước họ đã nối thành một chuỗi theo sau là các ký tự dòng mới. Khi chuyển các biến, bạn cần giữ cuộc gọi Super () như bây giờ bạn đang sử dụng phương thức khởi tạo trừ khi bạn chuyển nó bằng một phương thức khác trước khi gọi chạy.

Quản lý chủ đề của bạn

Python có rất nhiều phương thức, biến và tham số hữu ích để quản lý các chủ đề của bạn. Đây là một số trong những cái cơ bản.

Đặt tên

Đặt tên cho các chủ đề có thể khá hữu ích để xác định chúng. Để làm điều này, khi tạo một luồng cuộc gọi

import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()
8 và truyền một chuỗi. Ví dụ:

thread = MyThread()
thread.setName('MyThread 1')
thread.start()

Bây giờ để lấy tên của luồng chỉ cần gọi

import threading

def worker():
    print ('Hello World\n') # Add \n so a newline is forced

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker)
    thread_list.append(thread)
    thread.start()
9 trên đối tượng luồng. Có một vài cách để có được đối tượng chủ đề tùy thuộc vào cách bạn lưu trữ nó. Nếu bạn ở trong luồng và bạn đang ở trong một lớp luồng, bạn chỉ có thể sử dụng
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
0; Ví dụ:

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
0

Nếu bạn muốn có được nó bên ngoài lớp, bạn có thể nhận được biến bạn đã lưu nó dưới và sử dụng nó. Ví dụ: khi tôi lưu các luồng trong danh sách trước đó, tôi chỉ có thể sử dụng một phần tử từ nó vì chúng là các đối tượng chủ đề tôi muốn. Ví dụ sau đây sẽ in tên của chủ đề đầu tiên được thêm vào danh sách này.

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
1

Tham gia chủ đề

Tham gia một chủ đề cho phép chúng tôi đợi cho đến khi nó bị chấm dứt trước khi chúng tôi tiếp tục. Ví dụ:

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
2

Trong ví dụ này, tôi tạo chủ đề và bắt đầu nó. Sau đó tôi gọi tham gia mà chờ cho đến khi chủ đề kết thúc. Nếu luồng được gọi là không kết thúc, luồng gọi là phương thức

$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
1 (có thể là luồng chính) sẽ đợi vô thời hạn. Điều này có nghĩa là bạn không nên sử dụng .Join () trên các luồng không hoàn thành trừ khi bạn muốn dừng việc thực hiện luồng vì một lý do khác.

Bạn có thể đợi nhiều chủ đề kết thúc bằng cách gọi .Join () sau khi bạn bắt đầu tất cả. Ví dụ sau đây sẽ đợi cho đến khi tất cả 4 chủ đề được hoàn thành trước khi nó chuyển đến câu lệnh in.

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
3

Chủ đề daemon

Một luồng daemon là một luồng sẽ không tiếp tục chạy nếu phần còn lại của tập lệnh đã dừng và không còn các luồng không phải là Daemon nữa. Chúng ta có thể nói chủ đề chính là không phải là Daemon vì nó không bị dừng đột ngột khi đó là luồng duy nhất chạy.

Điều này có nghĩa là đặt giá trị daemon chủ đề thành

$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
2 sẽ có nghĩa là nó sẽ không tiếp tục chạy sau khi chủ đề chính hoàn thành (hoặc các luồng không phải là daemon khác); Chúng ta có thể đặt
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
3 thành
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
4 để đảm bảo luồng tiếp tục chạy ngay cả khi luồng chính kết thúc. Giá trị daemon phải được đặt trước khi
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
5 được gọi trên luồng. Để đặt nếu một luồng là daemon, bạn có thể vượt qua
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
6 (hoặc
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
4) ở cùng một nơi tôi đặt Args trước:

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
4

Bạn có thể thay vào đó đặt một luồng thành Daemon bằng cách sử dụng

$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
8 trên luồng. Nếu bạn đang luồn một lớp, bạn có thể gọi
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
9 trong phương thức khởi tạo hoặc
$ python threading_method.py

Hello World
Hello World
Hello World
Hello World
8 trên luồng như nếu bạn đang luồn một phương thức. Ví dụ:

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
5

Để kiểm tra xem một luồng là daemon, bạn có thể kiểm tra

import threading

def worker(number):
    print ('I am thread: ' + str(number) + '\n')

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker, args=(i,))
    thread_list.append(thread)
    thread.start()
1 trên luồng; Đây là một bool.

Nhận tất cả các chủ đề

Nếu bạn muốn có được tất cả các chủ đề hiện đang sống, bạn có thể gọi

import threading

def worker(number):
    print ('I am thread: ' + str(number) + '\n')

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker, args=(i,))
    thread_list.append(thread)
    thread.start()
2. Điều này sẽ trả về tất cả các chủ đề còn sống bao gồm cả luồng chính trong một danh sách. Nếu bạn muốn lấy tất cả tên của các chủ đề còn sống hiện tại, hãy sử dụng:

threading.Thread(target=test, args=(arg1, arg2=arg2)).start()
6

Là một chủ đề còn sống?

Nếu bạn muốn kiểm tra xem một chủ đề cụ thể có còn sống không, bạn có thể gọi

import threading

def worker(number):
    print ('I am thread: ' + str(number) + '\n')

thread_list = []
for i in range(4):
    thread = threading.Thread(target=worker, args=(i,))
    thread_list.append(thread)
    thread.start()
3 trên luồng. Điều này sẽ trả về true nếu chủ đề vẫn đang chạy.

Tại sao nó sẽ không làm cho tập lệnh của bạn chạy nhanh hơn

Trong hầu hết các trường hợp, việc xâu chuỗi mã đã tồn tại của bạn sẽ không làm cho nó chạy nhanh hơn. Các chủ đề Python được thiết kế để chạy nhiều tác vụ cùng một lúc, tuy nhiên, đây chỉ là trên một lõi CPU.

Một tập lệnh Python bình thường được chạy trên một lõi duy nhất, vì vậy khi bạn tạo các luồng, nó sẽ không tăng tốc vì về cơ bản nó đang làm điều tương tự chỉ vào các thời điểm khác nhau. Vấn đề/tính năng này (nếu bạn muốn nhìn nó theo cách tích cực) là do khóa phiên dịch toàn cầu, trong đó có nghĩa là "nhiều luồng không thể sử dụng nhiều lõi", đó là lý do để không tăng tốc độ . Đây là một cuộc nói chuyện tuyệt vời trên Gil với một số slide tuyệt vời.

Nếu bạn muốn có nhiều tác vụ chạy trên nhiều lõi, hãy xem mô -đun đa xử lý.

Vì đây chỉ là một cái nhìn cơ bản về việc xâu chuỗi nên một người chưa sử dụng nên nó có thể hiểu nó tốt hơn, tôi đã bỏ qua những thứ như sự kiện, tín hiệu và khóa. Để đọc thêm về các chủ đề, bạn có thể truy cập các trang này:

  • pymotw.com/3/threading/
  • Tài liệu tham gia Python 3

Bạn có thể chuyển đối số cho một chủ đề không?

Bạn chỉ có thể chuyển một đối số duy nhất cho hàm mà bạn đang gọi trong luồng mới.Tạo một cấu trúc để giữ cả hai giá trị và gửi địa chỉ của cấu trúc.Lưu câu trả lời này.. Create a struct to hold both of the values and send the address of the struct. Save this answer.

Chủ đề daemon trong Python là gì?

Các luồng luôn luôn chạy trong nền cung cấp các hỗ trợ cho các luồng chính hoặc không phải là Daemon, các luồng thực thi nền đó được coi là chủ đề daemon.Chủ đề daemon không chặn luồng chính thoát ra và tiếp tục chạy ở chế độ nền., those background executing threads are considered as Daemon Threads. The Daemon Thread does not block the main thread from exiting and continues to run in the background.

Chủ đề trong Python với ví dụ là gì?

Một chủ đề là gì?Một luồng là một luồng thực thi riêng biệt.Điều này có nghĩa là chương trình của bạn sẽ có hai điều xảy ra cùng một lúc.Nhưng đối với hầu hết các triển khai Python 3, các chủ đề khác nhau không thực sự thực hiện cùng một lúc: chúng chỉ xuất hiện.a separate flow of execution. This means that your program will have two things happening at once. But for most Python 3 implementations the different threads do not actually execute at the same time: they merely appear to.