Phương thức gọi python trong luồng

Chức năng này hữu ích khi bạn cần cung cấp lệnh gọi lại cho thư viện Python có thể gọi lệnh gọi lại trên chuỗi nền. Vì các hàm R phải chạy trên luồng chính, nên gói hàm R bằng

app1 = App1[]
app2 = App2[]
app3 = App3[]
4 sẽ đảm bảo rằng mã R chỉ được thực thi trên luồng chính

Tranh luận

f

Một hàm R với các đối số tùy ý

Giá trị

Hàm Python ủy quyền cho hàm R đã truyền, được đảm bảo luôn được gọi trên luồng chính

Đây là một đoạn mã nhỏ để chạy các phương thức lớp dưới dạng luồng nền trong Python. Phương thức run[] thực hiện một số công việc mãi mãi và trong trường hợp sử dụng này, bạn muốn nó thực hiện điều đó trong nền [cho đến khi ứng dụng chính chết], trong khi phần còn lại của ứng dụng vẫn tiếp tục hoạt động.

import threading
import time


class ThreadingExample[object]:
    """ Threading example class

    The run[] method will be started and it will run in the background
    until the application exits.
    """

    def __init__[self, interval=1]:
        """ Constructor

        :type interval: int
        :param interval: Check interval, in seconds
        """
        self.interval = interval

        thread = threading.Thread[target=self.run, args=[]]
        thread.daemon = True                            # Daemonize thread
        thread.start[]                                  # Start the execution

    def run[self]:
        """ Method that runs forever """
        while True:
            # Do something
            print['Doing something imporant in the background']

            time.sleep[self.interval]

example = ThreadingExample[]
time.sleep[3]
print['Checkpoint']
time.sleep[2]
print['Bye']

Tôi sẽ hướng dẫn bạn qua những phần quan trọng nhất

app1 = App1[]
app2 = App2[]
app3 = App3[]
5 - Xác định chức năng nào sẽ thực thi. Xin lưu ý rằng tôi không có bất kỳ đối số nào trong ví dụ này. Nếu bạn làm như vậy, chỉ cần chèn chúng vào bộ args

app1 = App1[]
app2 = App2[]
app3 = App3[]
6 - Chạy chủ đề ở chế độ daemon. Điều này cho phép ứng dụng chính thoát ra ngay cả khi luồng đang chạy. Nó cũng sẽ [do đó] cho phép sử dụng ctrl+c để chấm dứt ứng dụng

từ luồng nhập Chủ đề;

# Một lớp tạo số vuông

lớp SuqareNumberSeriesThread[Chủ đề]

số đếm của tôi = 0

# Giá trị khởi tạo đã nhận và gán cho myCount

def __init__[self,args]

Chủ đề. __init__[bản thân]

bản thân. myCount = args

# Phương thức chạy bị ghi đè để xác định nội dung luồng

chạy def [tự]

cho tôi trong phạm vi [1, tự. myCount]

in[i*i];

SquareGenerator = SuqareNumberSeriesThread[args=[10]]

Máy phát điện vuông. bắt đầu[]

Máy phát điện vuông. tham gia[]

Một luồng là chuỗi nhỏ nhất của các hướng dẫn được lập trình được xử lý mà không bị gián đoạn bởi CPU. Đa luồng đề cập đến việc thực thi song song các luồng, do đó cho phép thực thi đồng thời nhiều ứng dụng và nhiều tác vụ trong một ứng dụng. Nhờ đa luồng, bạn có thể chạy đồng thời Microsoft Word, trình đọc PDF và nhiều ứng dụng khác. Tương tự, trong Microsoft Word, nhiều tác vụ có thể được thực hiện song song bằng cách sử dụng phân luồng. Chẳng hạn, trong khi bạn đang viết, trình kiểm tra chính tả được thực thi liên tục trong nền để giúp bạn sửa lỗi chính tả

Giống như tất cả các ngôn ngữ lập trình hiện đại, Python cũng cho phép bạn triển khai đa luồng trong các ứng dụng của mình. Trong bài viết này, bạn sẽ thấy cách bạn có thể triển khai đa luồng với Python và chúng tôi sẽ đưa ra các ví dụ về cách sử dụng đa luồng để chạy nhiều chức năng song song. Trước tiên hãy xem điều gì sẽ xảy ra khi bạn không triển khai đa luồng trong mã của mình

Tập lệnh Python không có đa luồng

Trong phần này, bạn sẽ thấy mã Python thực thi như thế nào khi bạn không triển khai đa luồng. Đây là hành vi “bình thường” của nhiều ngôn ngữ lập trình, bao gồm cả Python. Trong phần tiếp theo, chúng tôi sẽ chỉ cho bạn cách chạy song song các chức năng bằng cách sử dụng đa luồng và cách đa luồng tác động đến hành vi của mã của bạn

Đoạn script sau tạo ba lớp. Mỗi lớp chứa một hàm có tên là

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 thực thi vòng lặp for in một chuỗi đơn giản 5 lần trên bảng điều khiển của hệ thống

class App1:
    def run[self]:

        for i in range[5]:
            print["thread 1"]


class App2:
    def run[self]:
        for i in range[5]:
            print["thread 2"]

class App3:
    def run[self]:
        for i in range[5]:
            print["thread 3"]

Đoạn script sau tạo các đối tượng của ba lớp. Ứng dụng1, ứng dụng2, ứng dụng3

app1 = App1[]
app2 = App2[]
app3 = App3[]

Bây giờ chúng ta hãy gọi các hàm

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 bằng cách sử dụng các đối tượng của ba lớp

app1.run[]
app2.run[]
app3.run[]

Đầu ra bên dưới cho thấy mã chạy theo trình tự vì không có luồng. Đầu tiên, phương thức

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 của lớp App1 in chuỗi “thread 1” năm lần trên bàn điều khiển. Sau khi thực hiện xong, hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 của classApp2print chuỗi “luồng 2”, sau đó, App3 in “luồng 3” ra bàn điều khiển

Hàm

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 của lớpApp2 sẽ không thực thi cho đến khi quá trình thực thi hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 từ lớpApp1 kết thúc. Tương tự, chức năng
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 từ lớp App3 không chạy trước khi thực thi chức năng
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 từ lớp App2 hoàn tất

đầu ra

app1 = App1[]
app2 = App2[]
app3 = App3[]
2

Chạy các chức năng song song với đa luồng

Trong phần trước, bạn đã thấy ba hàm

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 từ các lớp App1, App2 và App3 chạy tuần tự. Đây có thể là hành vi bạn thường thấy, nhưng nếu bạn muốn thực hiện song song ba chức năng này thì sao?

Để triển khai luồng trong Python, bạn phải thực hiện ba bước

  1. Kế thừa lớp chứa chức năng bạn muốn chạy trong một luồng riêng biệt bằng cách sử dụng lớp Thread
  2. Đặt tên cho chức năng bạn muốn thực hiện trong một luồng
    app1 = App1[]
    app2 = App2[]
    app3 = App3[]
    9
  3. Gọi hàm
    app1.run[]
    app2.run[]
    app3.run[]
    9 từ đối tượng của lớp chứa phương thức
    app1 = App1[]
    app2 = App2[]
    app3 = App3[]
    9. Hàm
    app1.run[]
    app2.run[]
    app3.run[]
    9 gọi phương thức
    app1 = App1[]
    app2 = App2[]
    app3 = App3[]
    9 theo mặc định

Tập lệnh sau kế thừa các lớp App1, App2 và App3 từ lớp Thread. Bạn phải nhập mô-đun luồng để truy cập lớp Chủ đề, đây là những gì chúng tôi thực hiện trong dòng đầu tiên của tập lệnh

app1 = App1[]
app2 = App2[]
app3 = App3[]
9

Khi đã thiết lập xong, hãy tạo các đối tượng của ba lớp, như thế này

app1 = App1[]
app2 = App2[]
app3 = App3[]

Thay vì gọi hàm

app1.run[]
app2.run[]
app3.run[]
9, hãy xem điều gì sẽ xảy ra nếu chúng ta gọi hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9

app1.run[]
app2.run[]
app3.run[]

đầu ra

app1 = App1[]
app2 = App2[]
app3 = App3[]
2

Đầu ra giống hệt với đầu ra khi chúng ta thực hiện ba hàm

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 theo trình tự. Như chúng tôi đã nói trước đó, để thực thi một hàm trong luồng, bạn cần gọi phương thức
app1.run[]
app2.run[]
app3.run[]
9. Đằng sau hậu trường, phương thức
app1.run[]
app2.run[]
app3.run[]
9 thực thi từng phương thức
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 trong một luồng riêng biệt. Được rồi, bây giờ chúng ta hãy thực thi đoạn script sau

class App1:
    def run[self]:

        for i in range[5]:
            print["thread 1"]


class App2:
    def run[self]:
        for i in range[5]:
            print["thread 2"]

class App3:
    def run[self]:
        for i in range[5]:
            print["thread 3"]
9

Khi bạn chạy đoạn mã trên, bốn luồng sẽ thực thi song song. Chuỗi đầu tiên là chuỗi chính được tạo theo mặc định khi bạn chạy bất kỳ tập lệnh Python nào. Khi thời gian chạy đạt đến câu lệnh

app1 = App1[]
app2 = App2[]
app3 = App3[]
29 bên trong luồng chính, một luồng mới được tạo bắt đầu chạy song song với luồng chính. Bên trong luồng chính, việc thực thi các câu lệnh
app1 = App1[]
app2 = App2[]
app3 = App3[]
90 và
app1 = App1[]
app2 = App2[]
app3 = App3[]
91 tạo thêm hai luồng chạy song song với luồng chính và luồng đã tạo trước đó cho hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 của lớp App1

Bây giờ đầu ra cho thấy kết quả không theo trình tự. Bạn vẫn có thể thấy rằng bạn có nhiều chuỗi được in bởi hàm

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 của lớp App2 trước khi hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 của lớp App3 thực thi, nhưng có một lý do cho điều đó. Các luồng đang được thực thi song song, nhưng các tập lệnh trong hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9 quá nhỏ nên nhiều lần lặp lại vòng lặp for được thực thi bởi một luồng trước khi đầu ra của bàn điều khiển được các luồng khác chạy song song truy cập

Chúng tôi đã chạy mã Python đa luồng này trên hai hệ thống khác nhau và nhận được hai kết quả đầu ra này

Đầu ra 1

app1 = App1[]
app2 = App2[]
app3 = App3[]
7

Đầu ra 2

app1 = App1[]
app2 = App2[]
app3 = App3[]
0

Nếu bạn chỉ muốn một lần lặp của vòng lặp for thực thi bên trong hàm

app1 = App1[]
app2 = App2[]
app3 = App3[]
9 trước khi đầu ra của bàn điều khiển được các luồng khác truy cập, bạn có thể thêm một độ trễ nhỏ với hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
97. Trong tập lệnh sau, độ trễ 1 giây được thêm vào bên trong vòng lặp for của mỗi hàm
app1 = App1[]
app2 = App2[]
app3 = App3[]
9. Điều này sẽ tạm dừng việc thực hiện các vòng lặp for trong một giây sau mỗi lần thực hiện. Loại này đánh bại mục đích của đa luồng nhưng nó giúp chứng minh mã của chúng tôi đang chạy nhiều luồng cùng một lúc

app1 = App1[]
app2 = App2[]
app3 = App3[]
1

Trong kết quả bên dưới, bạn có thể thấy rằng bây giờ sau mỗi lần lặp, bảng điều khiển được gán cho một luồng khác và do đó, bạn có thể thấy một lần lặp của vòng lặp for từ mỗi luồng. Đầu ra sau đây cho thấy rõ ràng rằng ba luồng đang chạy song song

đầu ra

app1 = App1[]
app2 = App2[]
app3 = App3[]
2

Nhận miễn phí Bộ công cụ dành cho nhà phát triển Python của chúng tôi

Tôi đã tập hợp Bộ công cụ dành cho nhà phát triển Python với hơn 100 tập lệnh Python được tạo sẵn bao gồm cấu trúc dữ liệu, Pandas, NumPy, Seaborn, máy học, xử lý tệp, quét web và nhiều thứ khác - và tôi muốn bạn có bộ công cụ này miễn phí. Nhập địa chỉ email của bạn dưới đây và tôi sẽ gửi một bản sao theo cách của bạn

Chúng ta có thể gọi chức năng như một chủ đề?

Có, nhưng bạn nên lưu ý rằng chức năng không thay đổi trạng thái theo cách mà các luồng khác sẽ bị ảnh hưởng tiêu cực .

Phương thức run[] được gọi trong Python như thế nào?

Phương thức run[] tiêu chuẩn gọi đối tượng có thể gọi được chuyển đến hàm tạo của đối tượng làm đối số đích, nếu có, với các đối số vị trí và từ khóa được lấy từ các đối số args và kwargs, . .

Hàm Python nào có thể được gọi để chạy một luồng?

Trong Python, chúng ta có thể tạo và chạy các luồng bằng mô-đun threading

Bạn có thể xâu chuỗi một hàm trong Python không?

Phân luồng 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ó tên là “luồng”, bạn tạo các đối tượng “Thread” và chúng chạy các hàm mục tiêu cho bạn. Bạn có thể bắt đầu hàng trăm luồng tiềm năng sẽ hoạt động song song.

Chủ Đề