python3 Ctrl C中斷程式優化

2021-10-22 16:14:22 字數 3110 閱讀 8791

已知:

在window中cmd下,支援輸入ctrl+c,測試成功

linux系統中,shell下,支援輸入ctrl+c,測試成功

場景一:執行中斷訊號後,程式按流程正常退出

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# author : jia666

# time : 2021/3/19 16:34

'''已知執行乙個程式時,輸入ctrl+c就會中斷程式,終止程式

模擬場景:乙個函式生產資料,生產滿100000次時,資料入庫,流程結束

因特殊原因,緊急要求停止生產資料,如果直接使用ctrl+c就會中斷程式,導致生成的資料無法入庫

為避免生產的資料丟失,組織要求將已經生產的資料,入庫後,再正常終止程式'''

import signal

import

time

def handle_sigint(signum, frame):

try:

global sign

sign=false

except exception as e:

print(e)

def main(

): global sign

count_time=0

signal.signal(signal.sigint, handle_sigint)

# 註冊sigint訊號的處理器為handle_sigint函式

while sign:

count_time+=1

if count_time<100000:

time.sleep(1)

print(

'生產資料中..........'

) else:

break

if __name__ ==

'__main__'

: sign=true

main(

) print(

'資料入庫成功'

)

場景二:執行中斷訊號後,多執行緒正常按流程退出

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# author : jia666

# time : 2021/3/19 17:38

import signal

from threading import thread

import time

import random

'''任務場景

多執行緒執行乙個生產資料函式,迴圈執行10次後,入庫

因特殊原因,緊急要求停止生產資料,如果直接使用ctrl+c就會中斷程式,導致生成的資料無法入庫

為避免生產的資料丟失,組織要求將已經生產的資料,入庫後,再正常終止程式

'''def

handle_sigint

(signum, frame)

:try

:global sign

sign=

false

except exception as e:

print

(e)class

a(thread)

:def

__init__

(self)

:super()

.__init__(

)def

run(self)

: a = random.randint(1,

3)# 隨機時間

time.sleep(a)

print

('資料生產中..........'

)if __name__ ==

'__main__'

: thd_num=

5#多執行緒限定數

thread_list =

# 多執行緒列表

i=0 sign=

true

signal.signal(signal.sigint, handle_sigint)

# 註冊sigint訊號的處理器為handle_sigint函式

count_times=

0while sign:

count_times+=

1#迴圈計數

while

true

: thd_sign=

false

#新執行緒建立與否標誌

iflen

(thread_list)

==thd_num:

#執行緒開啟是否完全

thread_list =

[t for t in thread_list if t.is_alive()]

# 記錄存活的執行緒

iflen

(thread_list)

== thd_num:

#存活執行緒已滿負荷,等待一段時間後再次檢測

print

('睡眠3秒'

) time.sleep(3)

else

: thd_sign =

true

else

: thd_sign=

true

if thd_sign:

#建立新執行緒

for t in

range

(thd_num-

len(thread_list)):

#沒有完全開啟,繼續開啟新執行緒

sa = a(

) sa.start(

)break

if count_times>10:

break

[t.join(

)for t in thread_list]

#等待執行緒完成

print

('資料入庫完成'

)

python 3 協程函式

1 把函式的執行結果封裝好 iter 和 next 即得到乙個迭代器 2 與return功能類似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值 3 函式暫停與再繼續的狀態是由yield儲存的 def func count print start while tru...

python3協程數量限制 多工 3 協程

環境 python3.6 非同步io 我們知道,cpu 速度遠遠快於磁碟 網路等 io。在 io 程式設計中,假如乙個 io 操作阻塞了當前執行緒,會導致其他 無法執行,所以我們使用多執行緒或者多程序來併發執行 針對這個問題,我們需要另一種解決方法 非同步 io。非同步 io,即當 需要執行乙個耗時...

python3協程學習筆記

在此之前,協程對我來說是乙個比較陌生的概念,學習之後,發現其應用場景還是有不少,大師之言 協程能自然地表述很多演算法,例如 遊戲 非同步i o,以及其他事件驅動型邊吃形式活協作式多工。舉例來說,asyncio tornado twisted simpy庫都是基於協程特性在單個執行緒中管理多個併發活動...