1. 程式人生 > >ctrl+c關閉多執行緒python程式

ctrl+c關閉多執行緒python程式

專案中經常需要用到多執行緒,如果一個python程式用了多執行緒,當子執行緒沒有結束時,用ctrl+c是關閉不了主執行緒的,這時候就只能用kill命令殺掉,這樣會很麻煩。

所以探討了下怎麼ctrl+C關閉多執行緒python程式,也在網上查了很多別人的做法,自己做了很多實驗,嘗試了很多種方法,總結得出一個能用的方法就是,把子執行緒setDeamon(True),通過isAlive方法實現join的功能。

程式碼:

複製程式碼
#encoding=utf-8
__author__ = '[email protected]'
import threading
from time import sleep
def f(): sleep(100) p=threading.Thread(target=f) p.setDaemon(True) p.start() # p.join() while 1: if not p.isAlive(): break sleep(1) print 'done'
複製程式碼

當子執行緒很多的時候,可以用這個函式

複製程式碼
def threads_join(threads):
    '''
    令主執行緒阻塞,等待子執行緒執行完才繼續,使用這個方法比使用join的好處是,可以ctrl+c kill掉程序
    '''
    for
t in threads: while 1: if t.isAlive(): sleep(10) else: break
複製程式碼

這種做法的壞處就是令主執行緒阻塞,直到子執行緒執行完這個功能的實現太麻煩了,原本用join來實現就好方便很多

下面是研究的過程中的嘗試,但是全部都實現不了ctrl+C關閉的功能

原始的多執行緒程式

複製程式碼
def f():
    sleep(100)
p=threading.Thread(target=f)
p.start()
p.join()

print 'done'
複製程式碼

這是最原始的一個多執行緒程式。

嘗試一:設定執行緒為守護執行緒,即加入

p.setDaemon(True)

但是ctrl+c,程式沒反應,跟沒加是一樣的

嘗試二:使用訊號,因為ctrl c的時候系統會向程式傳送sigint訊號,所以我們可以令程式捕獲這個訊號,並呼叫os的kill方法殺死自己

複製程式碼
import signal
import os
import threading
from time import sleep
def f(a,b):
    print 'kill me'
    os.kill(os.getpid(),signal.SIGKILL)

def tf():
    sleep(20)

signal.signal(signal.SIGINT,f)
p=threading.Thread(target=tf)
p.start()
p.join()

print 'done'
複製程式碼

程式執行後,我立刻按ctrl c ,主執行緒會等子執行緒sleep20後,才會print 'kill me',證明主執行緒在等待子執行緒執行的時候,即join的時候,是捕獲不了系統發來的訊號的,要等子執行緒執行完畢,才能捕獲。所以這個方法還是不行。

嘗試三,用一個標誌來讓子執行緒自己結束自己的執行

複製程式碼
is_exit=0
def f(a,b):
    global is_exit
    is_exit=1
    print 'kill me'
    os.kill(os.getpid(),signal.SIGKILL)

def tf():
    while not is_exit:
        sleep(20)

signal.signal(signal.SIGINT,f)
p=threading.Thread(target=tf)
p.start()
while 1:
    sleep(10)

print 'done'
複製程式碼

這裡加入一個標誌is_exit用來標誌子執行緒是否繼續執行,然後加入訊號,當捕獲關閉訊號時,把is_exit改為1,令到子執行緒自己結束,由於主執行緒在join的狀態下是接受不了訊號的,所以這裡讓主執行緒處於一直等待的狀態。

這個做法是能做到ctrl c關閉子執行緒的,缺點就是子執行緒需要做完一個迴圈才能結束,同時主執行緒沒有了join的功能,適用於主執行緒在給子執行緒發放任務後就不需要做任何操作的情形。

所以總的來說,ctrl c不能關閉多執行緒的程式的主要原因是使用了join方法,一旦用了join,主執行緒就會一直處於阻塞狀態,不接受任何外界的聯絡。但是join方法在實際的業務中是經常需要用到的,我查了很久也沒有查到可以替代join的,同時可以被ctrl c的方法。上面第一個程式用到的使用alive方法來實現join的功能的做法算是一個不太好,但又不能不使用它的解決方案了,希望後面能找到更好的實現join功能的方法。

相關推薦

ctrl+c關閉執行python程式

專案中經常需要用到多執行緒,如果一個python程式用了多執行緒,當子執行緒沒有結束時,用ctrl+c是關閉不了主執行緒的,這時候就只能用kill命令殺掉,這樣會很麻煩。 所以探討了下怎麼ctrl+C關閉多執行緒python程式,也在網上查了很多別人的做法,自己做了很多實驗,嘗試了很多種方法,總結得出一個能

C#構建執行應用程式(4) —— 併發問題

在構建多執行緒的應用程式時,我們需要找到一種方式來控制多個執行緒對共享資源的同步訪問。System.Threading名稱空間提供了一些以同步為中心的型別。C#程式語言也提供了一個特別的關鍵字,它能在

linux下C開發執行程式

轉:https://blog.csdn.net/lingfemg721/article/details/6574804   linux下用C開發多執行緒程式,Linux系統下的多執行緒遵循POSIX執行緒介面,稱為pthread。   #

執行程式設計程式關閉了,但程序還在的解決方案

自己編的一個串列埠程式,從串列埠除錯助手中讀取資料,採用非同步方式,需要用到多執行緒程式設計, 但是每次執行程式,關閉程式時,開啟程序列表,發現程序還在,導致每次串列埠傳送資料過來時,都先要去手動結束程序, 找了很多方法,發現不會用, 下面是一個很簡單的方法,也很管用: 在

Python 執行程式不結束程序的程式不結束的區別

import time from threading import Thread from multiprocessing import Process #守護程序:主程序程式碼執行執行結束,守護程序隨之結束 #守護執行緒:守護執行緒會等待所有非守護執行緒執行結束才結束 def f1():

C#程式設計之執行爬蟲程式

一、簡單介紹: 技術方面主要包括: (1)技術選型: 1) 課程設計使用的開發語言是C#。 2)課程設計選用了檔案流方式獲取網站資料。 3)課程設計使用多執行緒抓取網頁程式碼。 4)課

Python執行Socket程式例子

如果沒有multitask包,請從http://python-multitask.googlecode.com/files/multitask-0.2.0.zip server端 Python程式碼  from __future__ import with_st

C# Socket執行程式設計例項-聊天程式

C#是微軟隨著VS.net新推出的一門語言。它作為一門新興的語言,有著C++的強健,又有著VB等的RAD特性。而且,微軟推出C#主要的目的是為了 對抗Sun公司的Java。大家都知道Java語言的強大功能,尤其在網路程式設計方面。於是,C#在網路程式設計方面也自然不甘

Python執行求和程式

今天寫了一個Python的多執行緒求和程式。滿足以下要求: 1、可以設定步長 2、步長可為負 3、支援小數 4、可指定執行緒數 5、處理各種無效輸入 程式如下: import threading from math import ceil result = 0 def

C語言之執行機制(程式可以同時被執行而不會相互干擾)

接觸過linux的人或多或少知道,linux有多執行緒的機制,也就是說程式可以同時執行,不受干擾,關於這個在我以前的博文裡有過類似模擬的時間片輪轉程式,跟這個其實是類似的。其實在window上,執行緒的標頭檔案也是可以包含進來使用的,我這裡用DevC++這個軟體來測試,看看

[轉]c++11 執行 future/promise

[轉自 https://blog.csdn.net/jiange_zh/article/details/51602938] 1. < future >標頭檔案簡介 Classes std::future std::future_error std::packaged_task std::pro

C#非同步執行總結(delegate、Thread、Task、ThreadPool、Parallel、async、cancel)

同步與非同步多執行緒的區別: 1、同步方法卡介面(UI執行緒忙於計算);非同步多執行緒不卡介面(主執行緒閒置,子執行緒在計算) 2、同步方法慢(CPU利用率低、資源耗費少);非同步多執行緒快(CPU利用率高、資源耗費多) 3、同步方法是有序的;非同步方法是無序的(啟動無序、執行時間不確定、結

c++11執行 thread

 1.thread建構函式 default (1) thread() noexcept; initialization (2) template <class Fn, class... Args> explicit

Boost ptree 解析json字串 執行程式crash

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++11 執行執行共享資料

共享資料的問題 這些在作業系統中都有詳細的介紹,可以回顧作業系統課程。。很典型的就是資料競爭問題。 互斥量保護資料 最原始的方式:使用std::mutex建立互斥量,使用成員lock()加鎖,使用成員unlock()解鎖。但是這種方式需要我們在每個函數出口都呼叫一次unloc

C#關於執行執行同步 lock鎖的應用

Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

C++:執行與鎖

多執行緒是小型軟體開發必然的趨勢。C++11將多執行緒相關操作全部整合到標準庫中了,省去了某些坑庫的編譯,真是大大的方便了軟體開發。多執行緒這個庫簡單方便實用,下面給出簡單的例子     #include <iostream> #inc

C語言執行

將按鍵 和LED燈的控制放在兩個執行緒,因為通過按鍵檢測是阻塞 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <

C語言執行目錄操作

#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <sys/types.h>#include <dirent.h> #define NUM 2 void threa

c++11執行執行

最近需要開發一個高效能運算庫,涉及到c++多執行緒的應用,上次做類似的事情已經是4年多以前了,印象中還頗有些麻煩。悔當初做了就算了,也沒想著留點記錄什麼的。這次又研究了一番,發現用上c++11特性之後,現在已經比較簡單了,在此記錄一下。   最簡單的多執行緒情況,不涉及公共變數,各個執行緒之間獨