Bạn có thể làm gián đoạn chủ đề chính thông qua hàm _Thread.Interrupt_main [].interrupt the main thread via the _thread.interrupt_main[] function.
Trong hướng dẫn này, bạn sẽ khám phá cách làm gián đoạn chủ đề chính từ một chủ đề khác trong Python.interrupt the main thread from another thread in Python.
Bắt đầu nào.
- Cần làm gián đoạn chủ đề chính
- Cách làm gián đoạn chủ đề chính
- Ngắt chủ đề chính và xử lý với ngoại lệ
- Ngắt chủ đề chính và xử lý với trình xử lý tín hiệu
- Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính
- Đọc thêm
- Takeaways
Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.thread of execution in a computer program.
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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.
Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để 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à lớp luồng.threading.Thread class.
Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:
- Chủ đề trong Python: Hướng dẫn hoàn chỉnh
Trong lập trình đồng thời, chúng ta có thể cần phải làm gián đoạn luồng chính từ một luồng khác.
Điều này có thể là vì nhiều lý do, chẳng hạn như:
- Một thay đổi lớn cho chương trình hoặc hệ thống bên ngoài.
- Một yêu cầu từ người dùng hoặc hệ thống khác.
- Một tài nguyên không còn hợp lệ hoặc có sẵn.
Làm thế nào chúng ta có thể làm gián đoạn chủ đề chính từ một chủ đề khác?
Cách làm gián đoạn chủ đề chính
Ngắt chủ đề chính và xử lý với ngoại lệ_thread.interrupt_main[] function.
Ngắt chủ đề chính và xử lý với trình xử lý tín hiệu
Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính
Đọc thêmsignal.SIGINT [interruption signal] that will be sent to the main thread. This is the signal sent when the user presses Ctrl-C on the command prompt.
Takeaways
Một chủ đề là một chủ đề thực thi trong một chương trình máy tính... 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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. _thread.interrupt_main[].interrupt_main[] |
Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời._thread.interrupt_main[] function.
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à lớp luồng.
Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính
Takeaways
Một chủ đề là một chủ đề thực thi trong một chương trình máy tính... 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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. _thread.interrupt_main[signum=signal.SIGKILL].interrupt_main[signum=signal.SIGKILL] |
Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để 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à lớp luồng.
Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:KeyboardInterrupt exception.
Takeaways
Một chủ đề là một chủ đề thực thi trong một chương trình máy tính... 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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. try:: Một chủ đề là một chủ đề thực thi trong một chương trình máy tính... 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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.KeyboardInterrupt: Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời. Một chủ đề là một chủ đề thực thi trong một chương trình máy tính... |
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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.signal.SIGINT.
Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.signal.signal[] function and specifying the signal number to handle and the function to handle it.
Takeaways
Một chủ đề là một chủ đề thực thi trong một chương trình máy tính. 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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.handle_sigint[signalnum,handler]: Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời. Một chủ đề là một chủ đề thực thi trong một chương trình máy tính... Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời. signal[SIGINT,handle_sigint][SIGINT,handle_sigint] |
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à lớp luồng.
Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:
Chủ đề trong Python: Hướng dẫn hoàn chỉnh
Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính
Đọc thêm
Takeaways
- Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.
- 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ả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.
- Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để 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à lớp luồng.
- Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:
Chủ đề trong Python: Hướng dẫn hoàn chỉnh
Trong lập trình đồng thời, chúng ta có thể cần phải làm gián đoạn luồng chính từ một luồng khác.
Download my FREE PDF cheat sheet
Ngắt chủ đề chính và xử lý với ngoại lệ
Điều này có thể là vì nhiều lý do, chẳng hạn như:
Một thay đổi lớn cho chương trình hoặc hệ thống bên ngoài.
Một yêu cầu từ người dùng hoặc hệ thống khác.
Một tài nguyên không còn hợp lệ hoặc có sẵn.time.sleep[] function for three seconds. It will then report a message that it is interrupting the main thread, then calls the _thread.interrupt_main[] function.
Hàm nhiệm vụ [] bên dưới thực hiện điều này.
# Nhiệm vụ được thực thi trong một luồng mới nhiệm vụ def []:task[]: & nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment sleep[3]sleep[3] & nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread & nbsp; & nbsp; & nbsp; & nbsp; in ['làm gián đoạn chủ đề chính ngay']print['Interrupting main thread now'] interrupt_main[]interrupt_main[] |
Tiếp theo, trong luồng chính, chúng tôi sẽ tạo một phiên bản mới. Chủ đề và định cấu hình nó để thực thi hàm Task []. Chủ đề sau đó có thể được bắt đầu bằng cách gọi hàm start [].threading.Thread instance and configure it to execute the task[] function. The thread can then be started by calling the start[] function.
..... # Bắt đầu chủ đề mới thread=Thread[target=task]=Thread[target=task] thread.start[].start[] |
Sau đó, chúng ta có thể chấp nhận tín hiệu SIGINT vì bị gián đoạn và sử dụng mẫu thử nghiệm thử để bắt một bàn phím tăng lên.KeyboardInterrupt.
Trong phần thân của Try-Except sẽ chặn mãi mãi để mô phỏng công việc, in một tin nhắn và ngủ trong nửa giây mỗi lần lặp.
Bàn phím được xử lý bằng cách in tin nhắn và chấm dứt luồng bằng một cuộc gọi đến hàm sys.exit [].KeyboardInterrupt is handled by printing a message and terminating the thread with a call to the sys.exit[] function.
..... # Bắt đầu chủ đề mới try:: Sau đó, chúng ta có thể chấp nhận tín hiệu SIGINT vì bị gián đoạn và sử dụng mẫu thử nghiệm thử để bắt một bàn phím tăng lên.# wait around whileTrue:whileTrue: Trong phần thân của Try-Except sẽ chặn mãi mãi để mô phỏng công việc, in một tin nhắn và ngủ trong nửa giây mỗi lần lặp.print['Main thread waiting...'] sleep[0.5]sleep[0.5] Bàn phím được xử lý bằng cách in tin nhắn và chấm dứt luồng bằng một cuộc gọi đến hàm sys.exit [].KeyboardInterrupt: # Xử lý bị gián đoạn# terminate main thread & nbsp; & nbsp; & nbsp; & nbsp;# chờ xung quanhprint['Main interrupted! Exiting.'] sys.exit[]sys.exit[] |
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;
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 | ngoại trừ bàn phím interrupt: & nbsp; & nbsp; & nbsp; & nbsp;# chấm dứt chủ đề chính & nbsp; & nbsp; & nbsp; & nbsp; in ['bị gián đoạn chính! thoát.']time import sleep Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.threading import Thread # SuperfastPython.com_thread import interrupt_main # Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Exceptsys # Nhiệm vụ được thực thi trong một luồng mới nhiệm vụ def []:task[]: & nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment sleep[3]sleep[3] & nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread & nbsp; & nbsp; & nbsp; & nbsp; in ['làm gián đoạn chủ đề chính ngay']print['Interrupting main thread now'] interrupt_main[]interrupt_main[] # Bắt đầu chủ đề mới thread=Thread[target=task]=Thread[target=task] thread.start[].start[] # Bắt đầu chủ đề mới try:: Sau đó, chúng ta có thể chấp nhận tín hiệu SIGINT vì bị gián đoạn và sử dụng mẫu thử nghiệm thử để bắt một bàn phím tăng lên.# wait around whileTrue:while True: Trong phần thân của Try-Except sẽ chặn mãi mãi để mô phỏng công việc, in một tin nhắn và ngủ trong nửa giây mỗi lần lặp.print['Main thread waiting...'] sleep[0.5]sleep[0.5] Bàn phím được xử lý bằng cách in tin nhắn và chấm dứt luồng bằng một cuộc gọi đến hàm sys.exit [].KeyboardInterrupt: # Xử lý bị gián đoạn# terminate main thread & nbsp; & nbsp; & nbsp; & nbsp;# chờ xung quanhprint['Main interrupted! Exiting.'] sys.exit[]sys.exit[] |
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;
ngoại trừ bàn phím interrupt:
& nbsp; & nbsp; & nbsp; & nbsp;# chấm dứt chủ đề chính
& nbsp; & nbsp; & nbsp; & nbsp; in ['bị gián đoạn chính! thoát.']KeyboardInterrupt
Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.
# SuperfastPython.com
# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except # Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except # Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except # Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except # Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except # Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except từ thời gian nhập vào giấc ngủ từ luồng nhập luồng |
từ _thread nhập ngắt_main
nhập khẩu sys
Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.
Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.
Chủ đề mới bắt đầu, chặn trong ba giây. Sau đó, nó gửi một sigint đến luồng chính và chấm dứt.
Chủ đề chính nhận được tín hiệu Sigint làm tăng bàn phím
Bàn phím được xử lý bằng cách báo cáo một tin nhắn và thoát khỏi luồng chính, lần lượt chấm dứt chương trình.
Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách chủ đề chính có thể mong đợi và xử lý sự gián đoạn với mẫu thử nghiệm thử.
Chủ đề chính đang chờ ...
Làm gián đoạn chủ đề chính ngay bây giờ
Chính bị gián đoạn! Thoát ra.
Tiếp theo, hãy để Lôi nhìn vào cách chủ đề chính có thể xử lý sự gián đoạn bằng cách sử dụng trình xử lý tín hiệu.handle_sigint[] function below implements this.
Khóa học luồng python miễn phí Tải xuống bảng gian lận 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.handle_sigint[signalnum,frame]: Khám phá cách sử dụng mô -đun luồng Python bao gồm cách tạo và khởi động các luồng mới và cách sử dụng khóa và semaphores mutex# terminate & nbsp; & nbsp; & nbsp; & nbsp;# chờ xung quanhprint['Main interrupted! Exiting.'] sys.exit[]sys.exit[] |
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;signal.signal[] function.
..... # Đăng ký trình xử lý tín hiệu cho quá trình này signal[SIGINT,handle_sigint][SIGINT,handle_sigint] |
Và đó là nó.
Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.
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 | # SuperfastPython.com # Ví dụ về việc gián đoạn luồng chính và tay cầm bằng trình xử lý tín hiệu từ thời gian nhập vào giấc ngủtime import sleep từ luồng nhập luồngthreading import Thread từ _thread nhập ngắt_main_thread import interrupt_main từ tín hiệu nhập tín hiệusignal import signal từ Sigint nhập tín hiệusignal import SIGINT nhập khẩu syssys # Xử lý đơn DEF Tay cầm_Sigint [SignalNum, Frame]:handle_sigint[signalnum,frame]: & nbsp; & nbsp; & nbsp; & nbsp;# chấm dứt# terminate & nbsp; & nbsp; & nbsp; & nbsp; in ['bị gián đoạn chính! thoát.']print['Main interrupted! Exiting.'] sys.exit[]sys.exit[] # Nhiệm vụ được thực thi trong một luồng mới nhiệm vụ def []:task[]: & nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment sleep[3]sleep[3] & nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread & nbsp; & nbsp; & nbsp; & nbsp; in ['làm gián đoạn chủ đề chính ngay']print['Interrupting main thread now'] interrupt_main[]interrupt_main[] # Đăng ký trình xử lý tín hiệu cho quá trình này signal[SIGINT,handle_sigint][SIGINT,handle_sigint] # Bắt đầu chủ đề mới thread=Thread[target=task]=Thread[target=task] thread.start[].start[] # Đợi xung quanh whileTrue:True: & nbsp; & nbsp; & nbsp; & nbsp; print ['Chủ đề chính chờ ...']print['Main thread waiting...'] sleep[0.5]sleep[0.5] |
Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.
Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.
Chủ đề mới bắt đầu, chặn trong ba giây. Sau đó, nó gửi một sigint đến luồng chính và chấm dứt.
Chủ đề chính nhận được tín hiệu sigint được xử lý bởi chức năng xử lý tín hiệu tùy chỉnh của chúng tôi. Hàm trả lời bằng cách báo cáo một tin nhắn và thoát khỏi luồng chính, lần lượt chấm dứt chương trình.
Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách luồng chính có thể mong đợi và xử lý sự gián đoạn với trình xử lý tín hiệu đã đăng ký.
Chủ đề chính đang chờ ... Chủ đề chính đang chờ ... Chủ đề chính đang chờ ... Chủ đề chính đang chờ ... Chủ đề chính đang chờ ... Chủ đề chính đang chờ ... Làm gián đoạn chủ đề chính ngay bây giờ Chính bị gián đoạn! Thoát ra. |
Tiếp theo, hãy để Lôi nhìn vào một ví dụ trong đó sự gián đoạn vào luồng chính bị trì hoãn.
Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính
Chúng ta có thể khám phá làm thế nào một sự gián đoạn của luồng chính có thể bị trì hoãn.
Điều này có thể xảy ra nếu luồng chính bị chặn, chẳng hạn như trong một cuộc gọi để ngủ, bằng cách thực hiện một cuộc gọi IO chặn hoặc bằng cách chờ đợi một nguyên thủy đồng thời.
Trong ví dụ này, chúng tôi sẽ có khối luồng chính trong một thời gian dài bằng cách gọi hàm ngủ. Chủ đề chính sẽ bị gián đoạn ở giữa giấc ngủ này, nhưng sẽ không phản hồi cho đến khi cuộc gọi chặn kết thúc.
Điều này có thể đạt được bằng cách cập nhật ví dụ đầu tiên ở trên xử lý sự gián đoạn bằng cách sử dụng khối Excet Try-Except.
Chúng ta có thể cập nhật luồng chính để thay vì lặp lại mãi mãi và ngủ trong một phần nhỏ, thay vào đó, không có vòng lặp và một cuộc gọi nào đến hàm thời gian.slege [] trong bảy giây.time.sleep[] function for seven seconds.
..... # Xử lý bị gián đoạn try:: & nbsp; & nbsp; & nbsp; & nbsp;# khối trong một thời gian dài# block for a long time & nbsp; & nbsp; & nbsp; & nbsp; print ['Chủ đề chính chờ ...']print['Main thread waiting...'] sleep[7]sleep[7] Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.KeyboardInterrupt: Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.# terminate main thread & nbsp; & nbsp; & nbsp; & nbsp; in ['bị gián đoạn chính! thoát.']print['Main interrupted! Exiting.'] sys.exit[]sys.exit[] |
# Nhiệm vụ được thực thi trong một luồng mới
Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.
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 | # SuperfastPython.com nhiệm vụ def []: từ thời gian nhập vào giấc ngủtime import sleep từ luồng nhập luồngthreading import Thread từ _thread nhập ngắt_main_thread import interrupt_main nhập khẩu syssys # Nhiệm vụ được thực thi trong một luồng mới nhiệm vụ def []:task[]: & nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment sleep[3]sleep[3] & nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread & nbsp; & nbsp; & nbsp; & nbsp; in ['làm gián đoạn chủ đề chính ngay']print['Interrupting main thread now'] interrupt_main[]interrupt_main[] # Bắt đầu chủ đề mới thread=Thread[target=task]=Thread[target=task] thread.start[].start[] # Xử lý bị gián đoạn try:: & nbsp; & nbsp; & nbsp; & nbsp;# khối trong một thời gian dài# block for a long time & nbsp; & nbsp; & nbsp; & nbsp; print ['Chủ đề chính chờ ...']print['Main thread waiting...'] sleep[7]sleep[7] Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.KeyboardInterrupt: Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.# terminate main thread & nbsp; & nbsp; & nbsp; & nbsp; in ['bị gián đoạn chính! thoát.']print['Main interrupted! Exiting.'] sys.exit[]sys.exit[] |
Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.
Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.
Chủ đề mới bắt đầu, chặn trong ba giây. Sau đó, nó gửi một sigint đến luồng chính và chấm dứt.
Chủ đề chính nhận được tín hiệu sigint được xử lý bởi chức năng xử lý tín hiệu tùy chỉnh của chúng tôi. Hàm trả lời bằng cách báo cáo một tin nhắn và thoát khỏi luồng chính, lần lượt chấm dứt chương trình.sleep[] function returns.
Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách luồng chính có thể mong đợi và xử lý sự gián đoạn với trình xử lý tín hiệu đã đăng ký.KeyboardInterrupt The KeyboardInterrupt is handled by reporting a message and exiting the main thread, which in turn terminates the program.
Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách luồng chính sẽ không phản hồi ngay lập tức nếu nó bị chiếm bởi một cuộc gọi chức năng chặn.
Chủ đề chính đang chờ ... Làm gián đoạn chủ đề chính ngay bây giờ Chính bị gián đoạn!Thoát ra. |
Đọc thêm
Phần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.
API
- Chủ đề - song song dựa trên luồng
Hướng dẫn
- Python Threading: Hướng dẫn hoàn chỉnh
Sách
- Bảng xác định API mô -đun chủ đề
- Chủ đề câu hỏi phỏng vấn API
- Python Threading Jump-Start, Jason Brownlee, 2022 [Sách của tôi!]. & NBSP;my book!].
Takeaways
Bây giờ bạn đã biết làm thế nào để làm gián đoạn chủ đề chính trong Python.
Bạn có câu hỏi nào không? Đặt câu hỏi của bạn trong các ý kiến dưới đây và tôi sẽ cố gắng hết sức để trả lời.
Ask your questions in the comments below and I will do my best to answer.
Ảnh của Kirk Thornton trên unplash