Luồng sự kiện python

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ả quy trình và luồng đều được tạo và quản lý bởi hệ điều hành bên dưới

Đôi khi, chúng tôi có thể cần tạo các luồng bổ sung trong chương trình của mình để 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à luồng. lớp chủ đề

Bạn có thể tìm hiểu thêm về Python thread trong hướng dẫn

  • Luồng trong Python. Hướng dẫn hoàn chỉnh

Trong lập trình đồng thời trong các luồng, đôi khi chúng ta cần phối hợp các luồng với một biến boolean. Điều này có thể là để kích hoạt một hành động hoặc báo hiệu một số kết quả

Điều này có thể đạt được với khóa loại trừ lẫn nhau [mutex] và biến boolean, nhưng không cung cấp cách nào để luồng chờ biến được đặt thành True

Thay vào đó, điều này có thể đạt được bằng cách sử dụng một đối tượng sự kiện

Đối tượng sự kiện là gì và chúng ta có thể sử dụng nó như thế nào trong Python?

Chạy các vòng lặp của bạn bằng cách sử dụng tất cả các CPU, tải xuống cuốn sách MIỄN PHÍ của tôi để tìm hiểu cách thực hiện

Cách sử dụng một đối tượng sự kiện

Python cung cấp một đối tượng sự kiện thông qua luồng. lớp sự kiện

Một sự kiện là một nguyên thủy đồng thời đơn giản cho phép giao tiếp giữa các luồng

một luồng. Đối tượng sự kiện bao bọc một biến boolean có thể là “đặt” [Đúng] hoặc “không đặt” [Sai]. Các chủ đề chia sẻ phiên bản sự kiện có thể kiểm tra xem sự kiện đã được đặt chưa, đặt sự kiện, xóa sự kiện [không đặt sự kiện] hoặc đợi sự kiện được đặt

các luồng. Sự kiện cung cấp một cách dễ dàng để chia sẻ một biến boolean giữa các luồng có thể hoạt động như một trình kích hoạt cho một hành động

Đây là một trong những cơ chế đơn giản nhất để giao tiếp giữa các luồng. một luồng báo hiệu một sự kiện và các luồng khác chờ đợi nó

— Đối tượng sự kiện, phân luồng — Tính song song dựa trên luồng

Trước tiên, một đối tượng sự kiện phải được tạo và sự kiện sẽ ở trạng thái “chưa đặt”

1

2

3

.. .

# tạo một thể hiện của một sự kiện

sự kiện = phân luồng. Sự kiện[]

Sau khi tạo, chúng ta có thể kiểm tra xem sự kiện đã được đặt chưa thông qua hàm is_set[] sẽ trả về True nếu sự kiện được đặt hoặc Sai nếu không

Ví dụ

1

2

3

4

.. .

# kiểm tra xem sự kiện đã được đặt chưa

nếu sự kiện. is_set[].

# làm việc gì đó

Sự kiện có thể được thiết lập thông qua hàm set[]. Bất kỳ chủ đề nào đang chờ sự kiện được đặt sẽ được thông báo

Ví dụ

1

2

3

.. .

# đặt sự kiện

sự kiện. đặt[]

Sự kiện có thể được đánh dấu là “chưa được đặt” [cho dù nó có được đặt hay không] thông qua hàm clear[]

1

2

3

.. .

# đánh dấu sự kiện là chưa được đặt

sự kiện. xóa[]

Cuối cùng, các chủ đề có thể đợi sự kiện được thiết lập thông qua hàm wait[]. Gọi hàm này sẽ chặn cho đến khi sự kiện được đánh dấu là đã đặt [e. g. một luồng khác gọi hàm set[]]. Nếu sự kiện đã được đặt, hàm wait[] sẽ trả về ngay lập tức

1

2

3

.. .

# chờ sự kiện được thiết lập

sự kiện. chờ đã[]

Từ việc xem xét mã nguồn để phân luồng. Sự kiện, luồng chờ chỉ được thông báo khi hàm set[] được gọi, không phải khi hàm clear[] được gọi

Đối số “hết thời gian chờ” có thể được chuyển đến hàm wait[], hàm này sẽ giới hạn thời gian một chuỗi sẵn sàng đợi trong vài giây để sự kiện được đánh dấu là đã đặt

Hàm wait[] sẽ trả về True nếu sự kiện được đặt trong khi chờ, nếu không, giá trị Sai được trả về cho biết rằng sự kiện chưa được đặt và cuộc gọi đã hết thời gian chờ

1

2

3

.. .

# chờ sự kiện được đặt với thời gian chờ

sự kiện. chờ đã[hết thời gian=10]

Bây giờ chúng ta đã biết cách sử dụng một luồng. Sự kiện, hãy xem một ví dụ đã hoạt động

Bối rối với API mô-đun phân luồng?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi

Ví dụ về việc sử dụng một đối tượng sự kiện

Chúng ta có thể khám phá cách sử dụng một luồng. đối tượng sự kiện

Trong ví dụ này, chúng tôi sẽ tạo một bộ chuỗi mà mỗi chuỗi sẽ thực hiện một số xử lý và báo cáo một thông báo. Tất cả các chủ đề sẽ sử dụng một sự kiện để chờ thiết lập trước khi bắt đầu công việc của họ. Chủ đề chính sẽ thiết lập sự kiện và kích hoạt xử lý trong tất cả các chủ đề

Đầu tiên, chúng ta có thể định nghĩa một hàm tác vụ đích nhận luồng được chia sẻ. Phiên bản sự kiện và một số nguyên duy nhất để xác định luồng

1

2

3

# chức năng nhiệm vụ mục tiêu

def nhiệm vụ[sự kiện, number]:

#

Tiếp theo, hàm sẽ đợi sự kiện được thiết lập trước khi bắt đầu công việc xử lý

1

2

3

.. .

# chờ sự kiện được thiết lập

sự kiện. chờ đã[]

Sau khi được kích hoạt, chuỗi sẽ tạo một số ngẫu nhiên, chặn trong giây lát và báo cáo một tin nhắn

1

2

3

4

5

.. .

# bắt đầu xử lý

giá trị = ngẫu nhiên[]

ngủ[giá trị]

in[f'Chuỗi {số} có {giá trị}']

Liên kết điều này lại với nhau, chức năng nhiệm vụ mục tiêu hoàn chỉnh được liệt kê bên dưới

1

2

3

4

5

6

7

8

# chức năng nhiệm vụ mục tiêu

def nhiệm vụ[sự kiện, number]:

    # đợi sự kiện được thiết lập

    sự kiện. chờ đã[]

    # bắt đầu xử lý

    giá trị = ngẫu nhiên[]

    ngủ[giá trị]

    print[f'Đã có chủ đề {number}]

Chủ đề chính trước tiên sẽ tạo luồng được chia sẻ. Phiên bản sự kiện, sẽ ở trạng thái “không được đặt” theo mặc định

1

2

3

.. .

# tạo một đối tượng sự kiện được chia sẻ

sự kiện = Sự kiện[]

Tiếp theo, chúng ta có thể bắt đầu năm luồng mới chỉ định hàm task[] mục tiêu với đối tượng sự kiện và một số nguyên duy nhất làm đối số

1

2

3

4

5

.. .

# tạo một bộ chủ đề

cho i trong phạm vi[5]:

    chuỗi = Chuỗi[target=task, args=[event, i]]

    chuỗi. bắt đầu[]

Cuối cùng, luồng chính sẽ chặn trong giây lát, sau đó kích hoạt quá trình xử lý trong tất cả các luồng thông qua đối tượng sự kiện

1

2

3

4

5

6

.. .

# chặn trong giây lát

in['Chặn luồng chính. ']

ngủ[2]

# bắt đầu xử lý trong tất cả các chủ đề

sự kiện. đặt[]

Liên kết tất cả những điều này lại với nhau, ví dụ hoàn chỉnh đượ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

#Trăn Siêu Nhanh. com

# ví dụ về việc sử dụng một đối tượng sự kiện

từ thời gian nhập ngủ

từ ngẫu nhiên nhập ngẫu nhiên

từ luồng nhập Luồng

từ phân luồng nhập Sự kiện

 

# chức năng nhiệm vụ mục tiêu

def nhiệm vụ[sự kiện, number]:

    # đợi sự kiện được thiết lập

    sự kiện. chờ đã[]

    # bắt đầu xử lý

    giá trị = ngẫu nhiên[]

    ngủ[giá trị]

    print[f'Đã có chủ đề {number}]

 

# tạo một đối tượng sự kiện được chia sẻ

sự kiện = Sự kiện[]

# tạo một bộ chủ đề

cho i trong phạm vi[5]:

    chuỗi = Chuỗi[target=task, args=[event, i]]

    chuỗi. bắt đầu[]

# chặn trong giây lát

in['Chặn luồng chính. ']

ngủ[2]

# bắt đầu xử lý trong tất cả các chủ đề

sự kiện. đặt[]

# chờ cho tất cả các chủ đề kết thúc

Chạy ví dụ đầu tiên tạo và bắt đầu năm chủ đề. Mỗi luồng chờ sự kiện trước khi nó bắt đầu xử lý

Các khối luồng chính trong giây lát, cho phép tất cả các luồng bắt đầu và bắt đầu chờ sự kiện. Chủ đề chính sau đó đặt sự kiện. Điều này kích hoạt tất cả năm luồng thực hiện xử lý của chúng và báo cáo một thông báo

Lưu ý, kết quả cụ thể của bạn sẽ khác do sử dụng các số ngẫu nhiên

1

2

3

4

5

6

chặn chủ đề chính

Chủ đề 2 có 0. 12310258010408259

Chủ đề 4 có 0. 2951602689055347

Chủ đề 3 có 0. 2995528547475702

Chủ đề 0 nhận 0. 6661975710559368

Chủ đề 1 được 0. 6687449622581129

Khóa học lập trình Python miễn phí

Tải xuống bảng cheat 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 phân luồng Python, bao gồm cách tạo và bắt đầu các luồng mới cũng như cách sử dụng khóa và ngữ nghĩa mutex

Chủ Đề