Làm cách nào để sử dụng Pkill trong Python?

Mỗi chương trình Python được thực thi trong một Quy trình, đây là phiên bản mới của trình thông dịch Python. Quá trình này có tên MainProcess và có một luồng được sử dụng để thực hiện các hướng dẫn của chương trình được gọi là MainThread. 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 ta có thể cần tạo các tiến trình con mới 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 quy trình mới thông qua cơ chế đa xử lý. lớp quy trình

Bạn có thể tìm hiểu thêm về đa xử lý trong hướng dẫn

  • Đa xử lý trong Python. Hướng dẫn hoàn chỉnh

Trong lập trình đồng thời, đôi khi chúng ta có thể cần phải giết một tiến trình con một cách mạnh mẽ

Điều này có thể vì nhiều lý do, chẳng hạn như

  • Quá trình con nằm ngoài tầm kiểm soát
  • Các điều kiện mà tiến trình con yêu cầu đã thay đổi
  • Cần dừng ngay chương trình

Làm cách nào chúng ta có thể buộc chấm dứt hoặc giết một tiến trình con 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

Làm thế nào để giết một quá trình

Giết một quá trình là quyết liệt

Nếu có thể, tốt hơn hết là dừng một tiến trình con một cách an toàn

Điều này có thể đạt được bằng nhiều cách. Một cách tiếp cận phổ biến và đáng tin cậy là sử dụng đa xử lý được chia sẻ. đối tượng sự kiện. Quá trình con có thể kiểm tra trạng thái của sự kiện thường xuyên và nếu được đặt, nó có thể dọn sạch tài nguyên và chọn dừng

Bạn có thể tìm hiểu thêm về cách dừng tiến trình con một cách an toàn trong hướng dẫn

  • Cách dừng một tiến trình trong Python một cách an toàn

Tuy nhiên, một quá trình có thể bị dừng ngay lập tức

Nhược điểm là quy trình sẽ không có cơ hội để dọn dẹp, khiến nó có thể không an toàn

Đặc biệt

  • Các mệnh đề cuối cùng trong các mẫu thử-ngoại trừ-cuối cùng hoặc thử-cuối cùng sẽ không được thực thi
  • Trình xử lý thoát sẽ không được thực thi

Điều này có nghĩa là các tài nguyên mở như tệp và ổ cắm sẽ không bị đóng theo cách an toàn và có kiểm soát. Điều đó cũng có nghĩa là mọi trạng thái ứng dụng sẽ không được cập nhật

Tuy nhiên, đôi khi chúng ta có thể cần phải giết ngay một tiến trình con

Có hai cách tiếp cận chính để giết một tiến trình, đó là

  • Chấm dứt một quá trình thông qua Process. chấm dứt[]
  • Giết một tiến trình thông qua Process. giết chết[]

Chúng ta hãy lần lượt xem xét kỹ hơn từng

Cuộc gọi kết thúc [] trên Quy trình

Một quy trình có thể bị giết bằng cách gọi Quy trình. chức năng chấm dứt []

Cuộc gọi sẽ chỉ chấm dứt quá trình đích, không phải quá trình con

Phương thức này được gọi trên đa xử lý. Phiên bản quy trình cho quy trình mà bạn muốn chấm dứt. Bạn có thể có phiên bản này từ việc tạo quy trình hoặc có thể có được thông qua các phương thức mô-đun chẳng hạn như đa xử lý. hàm active_children[]

Ví dụ

1

2

3

.. .

# kết thúc quá trình

quy trình. chấm dứt[]

Phương thức không có đối số và không chặn

Chức năng sẽ kết thúc quá trình bằng tín hiệu SIGTERM [kết thúc tín hiệu] trên hầu hết các nền tảng hoặc tương đương trên windows

Tín hiệu SIGTERM được gửi đến một quá trình để yêu cầu kết thúc quá trình đó. Không giống như tín hiệu SIGKILL, nó có thể được bắt và giải thích hoặc bỏ qua bởi quy trình. Điều này cho phép tiến trình thực hiện việc giải phóng tài nguyên và lưu trạng thái kết thúc tốt đẹp nếu thích hợp. SIGINT gần giống với SIGTERM

- SIGTERM, Wikipedia

Gọi kill[] trên Process

Một quy trình có thể bị giết bằng cách gọi Quy trình. chức năng giết []

Cuộc gọi sẽ chỉ chấm dứt quá trình đích, không phải quá trình con

Phương thức này được gọi trên đa xử lý. Phiên bản quy trình cho quy trình mà bạn muốn chấm dứt. Bạn có thể có phiên bản này từ việc tạo quy trình hoặc có thể có được thông qua các phương thức mô-đun chẳng hạn như đa xử lý. hàm active_children[]

Ví dụ

1

2

3

.. .

# giết quá trình

quy trình. giết[]

Phương thức không có đối số và không chặn

Chức năng sẽ kết thúc quá trình bằng tín hiệu SIGKILL [tín hiệu tắt] trên hầu hết các nền tảng hoặc tương đương trên windows. Tín hiệu này không thể bỏ qua và không thể xử lý

Tín hiệu SIGKILL được gửi đến một tiến trình để khiến nó kết thúc ngay lập tức [kill]. Trái ngược với SIGTERM và SIGINT, tín hiệu này không thể bị bắt hoặc bị bỏ qua và quy trình nhận không thể thực hiện bất kỳ thao tác dọn dẹp nào khi nhận được tín hiệu này

- SIGKILL, Wikipedia

Bây giờ chúng ta đã biết cách hủy một tiến trình, hãy xem xét một số ví dụ đã hoạt động

Bối rối với API mô-đun đa xử lý?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi

Ví dụ về kết thúc một quá trình

Chúng ta có thể khám phá cách chấm dứt một tiến trình

Trong ví dụ này, chúng ta sẽ tạo một tiến trình con sẽ chạy một tác vụ trong một vòng lặp mãi mãi. Quá trình mẹ sẽ đợi một lúc rồi chọn kết thúc quá trình một cách mạnh mẽ

Đầu tiên, hãy định nghĩa một hàm tác vụ mà chúng ta có thể thực thi trong một tiến trình con

Hàm sẽ sử dụng vòng lặp while và sẽ lặp mãi mãi. Mỗi lần lặp lại, nó sẽ chặn trong một giây với lệnh gọi thời gian. sleep[] sau đó báo cáo một tin nhắn

Hàm task[] bên dưới thực hiện điều này

1

2

3

4

5

6

7

8

# chức năng nhiệm vụ tùy chỉnh

def nhiệm vụ[].

    # thực hiện tác vụ trong một vòng lặp

    trong khi Đúng.

        # chặn trong giây lát

        ngủ[1]

        # báo cáo thư

        in['Worker process running. ', xóa=True]

Tiếp theo, trong quy trình gốc, chúng ta có thể tạo một bộ xử lý đa xử lý mới. Phiên bản xử lý để chạy hàm task[] của chúng ta trong một tiến trình con mới

Điều này có thể đạt được bằng cách sử dụng từ khóa "mục tiêu" của đa xử lý. Hàm tạo lớp tiến trình

1

2

3

.. .

# tạo quy trình

quy trình = Quy trình[mục tiêu=task]

Sau khi tạo, chúng ta có thể bắt đầu quá trình

1

2

3

.. .

# chạy quy trình

quy trình. bắt đầu[]

Quá trình mẹ sau đó có thể chặn trong năm giây bằng lệnh gọi thời gian. ngủ[]

1

2

3

.. .

# Đợi một chút

ngủ[5]

Tiến trình cha sau đó sẽ thức dậy và buộc chấm dứt tiến trình con

1

2

3

.. .

# kết thúc quá trình

quy trình. chấm dứt[]

Quá trình chính sau đó sẽ tiếp tục, trong trường hợp này báo cáo một thông báo

1

2

3

.. .

# tiếp tục

in['Phụ huynh đang tiếp tục. ']

Liên kết đ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

#Trăn Siêu Nhanh. com

# ví dụ về kết thúc một quá trình

từ thời gian nhập ngủ

từ đa xử lý nhập Quy trình

 

# chức năng nhiệm vụ tùy chỉnh

def nhiệm vụ[].

    # thực hiện tác vụ trong một vòng lặp

    trong khi Đúng.

        # chặn trong giây lát

        ngủ[1]

        # báo cáo thư

        in['Worker process running. ', xóa=True]

 

# điểm vào

if __name__ == '__main__'.

    # tạo quy trình

    quy trình = Quy trình[target=task]

    # chạy quy trình

    quy trình. bắt đầu[]

    # chờ chút

    ngủ[5]

    # chấm dứt quá trình

    quy trình. chấm dứt[]

    # tiếp tục.

    in['Phụ huynh đang tiếp tục. ']

Việc chạy ví dụ trước tiên sẽ tạo và bắt đầu một tiến trình con mới để chạy hàm mục tiêu của chúng ta

Tiến trình con được bắt đầu và tiến trình cha chặn

Quá trình con cố gắng chạy mãi mãi, báo cáo một thông báo và ngủ trong một giây mỗi lần lặp lại

Quá trình cha thức dậy sau đó kết thúc mạnh mẽ quá trình con

Quá trình con bị dừng ngay lập tức. Quá trình mẹ sau đó tiếp tục và sau đó quyết định dừng lại

1

2

3

4

5

quy trình công nhân đang chạy

quy trình công nhân đang chạy

quy trình công nhân đang chạy

quy trình công nhân đang chạy

Phụ huynh đang tiếp tục

Tiếp theo, hãy xem xét việc kill một process

Khóa học đa xử lý Python miễn phí

Tải xuống bảng cheat API đa xử lý của tôi và như một phần thưởng, bạn sẽ nhận đượ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 đa xử lý Python, bao gồm cách tạo và bắt đầu các tiến trình con cũng như cách sử dụng khóa mutex và semaphores

Tìm hiểu thêm
 

Ví dụ về giết một tiến trình

Chúng ta có thể khám phá cách giết một tiến trình

Trong ví dụ này, chúng ta sẽ tạo một tiến trình con sẽ chạy một tác vụ trong một vòng lặp mãi mãi, như trong phần trước. Tiến trình cha sẽ đợi một lúc rồi chọn giết tiến trình con

Đầu tiên, hãy định nghĩa một hàm tác vụ mà chúng ta có thể thực thi trong một tiến trình con

Hàm sẽ sử dụng vòng lặp while và sẽ lặp mãi mãi. Mỗi lần lặp lại, nó sẽ chặn trong một giây với lệnh gọi thời gian. sleep[] sau đó báo cáo một tin nhắn

Hàm task[] bên dưới thực hiện điều này

1

2

3

4

5

6

7

8

# chức năng nhiệm vụ tùy chỉnh

def nhiệm vụ[].

    # thực hiện tác vụ trong một vòng lặp

    trong khi Đúng.

        # chặn trong giây lát

        ngủ[1]

        # báo cáo thư

        in['Worker process running. ', xóa=True]

Tiếp theo, trong quy trình gốc, chúng ta có thể tạo một bộ xử lý đa xử lý mới. Phiên bản xử lý để chạy hàm task[] của chúng ta trong một tiến trình con mới

Điều này có thể đạt được bằng cách sử dụng từ khóa "mục tiêu" của đa xử lý. Hàm tạo lớp tiến trình

1

2

3

.. .

# tạo quy trình

quy trình = Quy trình[mục tiêu=task]

Sau khi tạo, chúng ta có thể bắt đầu quá trình

1

2

3

.. .

# chạy quy trình

quy trình. bắt đầu[]

Quá trình mẹ sau đó có thể chặn trong năm giây bằng lệnh gọi thời gian. ngủ[]

1

2

3

.. .

# Đợi một chút

ngủ[5]

Tiến trình cha sau đó sẽ thức dậy và giết tiến trình con

1

2

3

.. .

# giết quá trình

quy trình. giết[]

Quá trình chính sau đó sẽ tiếp tục, trong trường hợp này báo cáo một thông báo

1

2

3

.. .

# tiếp tục

in['Phụ huynh đang tiếp tục. ']

Liên kết đ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

#Trăn Siêu Nhanh. com

# ví dụ về giết một tiến trình

từ thời gian nhập ngủ

từ đa xử lý nhập Quy trình

 

# chức năng nhiệm vụ tùy chỉnh

def nhiệm vụ[].

    # thực hiện tác vụ trong một vòng lặp

    trong khi Đúng.

        # chặn trong giây lát

        ngủ[1]

        # báo cáo thư

        in['Worker process running. ', xóa=True]

 

# điểm vào

if __name__ == '__main__'.

    # tạo quy trình

    quy trình = Quy trình[target=task]

    # chạy quy trình

    quy trình. bắt đầu[]

    # chờ chút

    ngủ[5]

    # hủy quy trình

    quy trình. giết[]

    # tiếp tục.

    in['Phụ huynh đang tiếp tục. ']

Việc chạy ví dụ trước tiên sẽ tạo và bắt đầu một tiến trình con mới để chạy hàm mục tiêu của chúng ta

Tiến trình con được bắt đầu và tiến trình cha chặn

Quá trình con cố gắng chạy mãi mãi, báo cáo một thông báo và ngủ trong một giây mỗi lần lặp lại

Quá trình cha thức dậy sau đó giết quá trình con

Quá trình con bị dừng ngay lập tức. Quá trình mẹ sau đó tiếp tục và sau đó quyết định dừng lại

1

2

3

4

5

quy trình công nhân đang chạy

quy trình công nhân đang chạy

quy trình công nhân đang chạy

quy trình công nhân đang chạy

Phụ huynh đang tiếp tục

Choáng ngợp trước các API đồng thời của python?
Để tìm sự giải thoát, hãy tải xuống Bản đồ tư duy về đồng thời Python MIỄN PHÍ của tôi

Câu hỏi thường gặp

Phần này liệt kê các câu hỏi phổ biến về việc giết một tiến trình

Bạn có câu hỏi nào không?
Hãy cho tôi biết trong phần nhận xét bên dưới và tôi có thể thêm câu hỏi đó vào phần này.

Khi nào nên sử dụng chấm dứt [] so với giết []?

Nói chung, một SIGTERM được gửi qua term[] ít mạnh hơn SIGKILL được gửi qua kill[]

Điều này là do SIGTERM có thể được xử lý bằng bộ xử lý tín hiệu, trong khi SIGKILL không thể

Tuy nhiên, đối với hầu hết các mục đích, hai cách tiếp cận là tương đương nhau

SIGTERM có thể được kích hoạt thông qua quy trình không. chấm dứt [] được xử lý?

Đúng

Bạn có thể đăng ký một chức năng để xử lý tín hiệu thông qua tín hiệu. chức năng tín hiệu []

Ví dụ dưới đây minh họa cách đăng ký một trình xử lý cho SIGTERM trong tiến trình con, cho phép nó dọn sạch trước khi thoát

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

29

30

31

32

33

34

35

36

37

38

#Trăn Siêu Nhanh. com

# ví dụ về kết thúc tiến trình con và xử lý tín hiệu

từ thời gian nhập ngủ

từ đa xử lý nhập Quy trình

từ tín hiệu nhập tín hiệu

từ tín hiệu nhập SIGTERM

nhập sys

 

#xử lý tín hiệu

def trình xử lý[sig, frame]:

    in['Dọn dẹp tiến trình con. ']

    ngủ[2]

    # hủy quy trình

    sys. thoát[0]

 

# chức năng nhiệm vụ tùy chỉnh

def nhiệm vụ[].

    # xử lý sigterm

    tín hiệu[SIGTERM, handler]

    # thực hiện tác vụ trong một vòng lặp

    trong khi Đúng.

        # chặn trong giây lát

        ngủ[1]

        # báo cáo thư

        in['Worker process running. ', xóa=True]

 

# điểm vào

if __name__ == '__main__'.

    # tạo quy trình

    quy trình = Quy trình[target=task]

    # chạy quy trình

    quy trình. bắt đầu[]

    # chờ chút

    ngủ[5]

    # chấm dứt quá trình

    quy trình. chấm dứt[]

    # tiếp tục.

    in['Phụ huynh đang tiếp tục. ']

SIGKILL có thể được kích hoạt thông qua quy trình không. kill[] Được xử lý?

Không

Điều gì xảy ra với các tiến trình con?

Một tiến trình với các tiến trình con có thể bị giết

Trong trường hợp này, tiến trình đích bị hủy và các tiến trình con không bị ảnh hưởng. Vì chúng không còn tiến trình cha, chúng được gọi là tiến trình mồ côi

Chủ Đề