Skip to content

Commit b0ed4fb

Browse files
committed
* 使用线程监听程序异常问题,不在阻塞主线程
* 解决子进程无法退出的bug
1 parent d98e040 commit b0ed4fb

File tree

3 files changed

+69
-11
lines changed

3 files changed

+69
-11
lines changed

CONTRIBUTING.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
### 更新日志
22

3-
#### JadeV2.2.6 - 2024-06-11
4-
* 解决Windows下打包由路径引发的bug
3+
#### JadeV2.2.7 - 2024-06-12
4+
* 使用线程监听程序异常问题,不在阻塞主线程
5+
* 解决子进程无法退出的bug
56
---
67

78
<details onclose>
89
<summary>查看更多更新日志</summary>
910

11+
#### JadeV2.2.6 - 2024-06-11
12+
* 解决Windows下打包由路径引发的bug
13+
---
14+
1015
#### JadeV2.2.5 - 2024-05-27
1116
* 优化数据库父类操作,解决异常问题,代码优化
1217
---

jade/jade_threading.py

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,30 @@
99
from threading import Thread
1010
from jade.jade_tools import *
1111
from queue import Queue
12+
13+
14+
class GracefulKiller:
15+
kill_now = False
16+
signals = {
17+
signal.SIGINT: 'SIGINT',
18+
signal.SIGTERM: 'SIGTERM'
19+
}
20+
21+
def __init__(self, func, *args):
22+
self.func = func
23+
self.args = args
24+
signal.signal(signal.SIGINT, self.exit_gracefully)
25+
signal.signal(signal.SIGTERM, self.exit_gracefully)
26+
27+
def exit_gracefully(self, signum, frame):
28+
self.func(self.args[0][0], self.args[0][1], self.args[0][2])
29+
time.sleep(1)
30+
self.kill_now = True
31+
32+
1233
class MonitorLDKThread(Thread):
13-
def __init__(self,pyldk,JadeLog,ldkqueue,time=60*60,max_session_size=1,feature_id_list=None,max_featuer_id=None):
34+
def __init__(self, pyldk, JadeLog, ldkqueue, time=60 * 60, max_session_size=1, feature_id_list=None,
35+
max_featuer_id=None, exit_queue=None):
1436
self.pyldk = pyldk
1537
self.JadeLog = JadeLog
1638
self.ldkqueue = ldkqueue
@@ -19,39 +41,45 @@ def __init__(self,pyldk,JadeLog,ldkqueue,time=60*60,max_session_size=1,feature_i
1941
self.max_featuer_id = max_featuer_id
2042
self.max_session_size = max_session_size
2143
self.handlequeue = Queue(maxsize=max_session_size)
44+
self.exit_queue = exit_queue
2245
super(MonitorLDKThread, self).__init__()
2346
self.start()
2447

2548
def exit(self):
2649
self.JadeLog.ERROR("加密狗异常,程序退出")
27-
Exit(-800)
50+
Exit(-800, self.exit_queue)
2851

2952
def logout(self):
3053
handle = self.handlequeue.get()
3154
self.pyldk.adapter.logout(handle)
55+
3256
def run(self):
3357
if self.feature_id_list:
3458
for feature_id in self.feature_id_list:
35-
haspStruct, feature_id, login_status = self.pyldk.login(feature_id,is_mutiple_feature_id=True)
59+
haspStruct, feature_id, login_status = self.pyldk.login(feature_id, is_mutiple_feature_id=True)
3660
if haspStruct.status == 0:
3761
self.handlequeue.put(haspStruct.handle)
3862
break
3963
if haspStruct.status != 0:
4064
haspStruct, feature_id, login_status = self.pyldk.login()
4165
self.pyldk.adapter.logout(haspStruct.handle)
42-
self.JadeLog.ERROR("加密狗初始化失败,请检查授权ID是否正确,支持的授权ID为:{},当前加密狗授权ID为:{},请重新授权...".format(','.join(str(i) for i in self.feature_id_list),feature_id))
66+
self.JadeLog.ERROR(
67+
"加密狗初始化失败,请检查授权ID是否正确,支持的授权ID为:{},当前加密狗授权ID为:{},请重新授权...".format(
68+
','.join(str(i) for i in self.feature_id_list), feature_id))
4369
self.exit()
4470
elif self.max_featuer_id:
4571
haspStruct, feature_id, login_status = self.pyldk.login()
4672
self.pyldk.adapter.logout(haspStruct.handle)
4773
if feature_id > self.max_featuer_id:
48-
self.JadeLog.ERROR("加密狗初始化失败,请检查授权ID是否正确,最大支持授权ID为:{},当前加密狗授权ID为:{},请重新授权...".format(self.max_featuer_id,feature_id))
74+
self.JadeLog.ERROR(
75+
"加密狗初始化失败,请检查授权ID是否正确,最大支持授权ID为:{},当前加密狗授权ID为:{},请重新授权...".format(
76+
self.max_featuer_id, feature_id))
4977
self.exit()
5078
else:
5179
haspStruct, feature_id, login_status = self.pyldk.login()
5280
self.pyldk.adapter.logout(haspStruct.handle)
5381
while haspStruct.status == 0 and login_status:
54-
haspStruct, feature_id,login_status = self.pyldk.login(feature_id)
82+
haspStruct, feature_id, login_status = self.pyldk.login(feature_id)
5583
if haspStruct.status == 0 and login_status:
5684
if self.handlequeue.qsize() == self.max_session_size:
5785
self.logout()
@@ -67,3 +95,15 @@ def run(self):
6795
self.JadeLog.DEBUG("加密狗监听正常")
6896
time.sleep(self.time)
6997
self.exit()
98+
99+
100+
class GetExitSignalThread(Thread):
101+
def __init__(self, func, *args):
102+
self.killer = GracefulKiller(func, args)
103+
super(GetExitSignalThread, self).__init__()
104+
self.start()
105+
106+
def run(self):
107+
while not self.killer.kill_now:
108+
time.sleep(1)
109+
Exit(-1)

jade/jade_tools.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# @Software : Samples
88
# @Desc :
99
import os
10+
import queue
1011
import sys
1112
import datetime
1213
import time
@@ -28,10 +29,14 @@ def zh_ch(string):
2829
"""
2930
return string.encode("gbk").decode('UTF-8', errors='ignore')
3031

31-
def Exit(exit_number):
32+
def Exit(exit_number,exit_queue=None):
3233
"""
3334
强制结束
3435
"""
36+
if exit_queue:
37+
for i in range(exit_queue.qsize()):
38+
process = exit_queue.get()
39+
process.kill()
3540
time.sleep(1)
3641
os._exit(exit_number)
3742

@@ -469,18 +474,26 @@ def __init__(self,func,*args):
469474
signal.signal(signal.SIGTERM, self.exit_gracefully)
470475

471476
def exit_gracefully(self, signum, frame):
472-
self.func(self.args[0][0],self.args[0][1])
477+
self.func(self.args[0][0],self.args[0][1],self.args[0][2])
473478
time.sleep(1)
474479
self.kill_now = True
475480

481+
482+
476483
def GetExitSignal(func,*args):
477484
killer = GracefulKiller(func,args)
478485
while not killer.kill_now:
479486
time.sleep(1)
480487
Exit(-1)
481-
def ldk_release(ldkqueue,JadeLog=None):
488+
def ldk_release(ldkqueue,JadeLog=None,exit_queue=None):
482489
if JadeLog:
483490
JadeLog.DEBUG("准备释放加密狗登录", True)
491+
if exit_queue:
492+
JadeLog.DEBUG("准备清除子进程",True)
493+
if exit_queue:
494+
for i in range(exit_queue.qsize()):
495+
process = exit_queue.get()
496+
process.kill()
484497
if ldkqueue.qsize() > 0:
485498
pyldk, handle = ldkqueue.get()
486499
pyldk.adapter.logout(handle)

0 commit comments

Comments
 (0)