已知:
在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庫都是基於協程特性在單個執行緒中管理多個併發活動...