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 Show
Đô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
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ư
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ìnhGiế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
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
Đ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ú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ìnhMộ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
Gọi kill() trên ProcessMộ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ý
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ý? Ví dụ về kết thúc một quá trìnhChú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ìnhChú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? Câu hỏi thường gặpPhầ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? 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 |