Skip to content

Commit 42f0213

Browse files
authored
Merge pull request #15 from sazima/task
fix: change PeriodicCallback -> time.sleep
2 parents 120d38e + cf78f3f commit 42f0213

File tree

6 files changed

+45
-30
lines changed

6 files changed

+45
-30
lines changed

client/heart_beat_task.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import asyncio
2-
import threading
2+
import logging
33
import time
44
import traceback
55

6-
from tornado import ioloop
76

87
from common import websocket
98
from common.logger_factory import LoggerFactory
@@ -16,30 +15,38 @@
1615

1716

1817
class HeatBeatTask:
19-
def __init__(self, ws: websocket.WebSocketApp):
18+
def __init__(self, ws: websocket.WebSocketApp, sleep_break: int,):
2019
self.ws: websocket.WebSocketApp = ws
2120
self.is_running = False
2221
self.recv_heart_beat_time: float = time.time()
23-
self.lock = asyncio.Lock()
22+
self.sleep_break = sleep_break
2423

2524
def set_recv_heart_beat_time(self, d: float):
2625
self.recv_heart_beat_time = d
2726

28-
async def run(self):
29-
if self.lock.locked():
30-
LoggerFactory.get_logger().error('locked return')
31-
return
32-
async with self.lock:
27+
def run(self):
28+
# asyncio.set_event_loop(self.event_loop)
29+
while True:
30+
time.sleep(self.sleep_break)
31+
if not self.is_running:
32+
continue
33+
if LoggerFactory.get_logger().isEnabledFor(logging.DEBUG):
34+
LoggerFactory.get_logger().debug('run send heartbeat')
3335
try:
34-
await asyncio.wait_for(ioloop.IOLoop.current().run_in_executor(None, self.send_heart_beat), timeout=20)
36+
# await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, self.send_heart_beat), timeout=20)
37+
self.send_heart_beat()
3538
except WebSocketConnectionClosedException:
3639
try:
37-
await asyncio.wait_for(ioloop.IOLoop.current().run_in_executor(None, self._close_and_on_close), timeout=20)
40+
self._close_and_on_close()
41+
# await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, self._close_and_on_close), timeout=20)
3842
except Exception:
3943
LoggerFactory.get_logger().error(traceback.format_exc())
4044
except Exception:
4145
LoggerFactory.get_logger().error(traceback.format_exc())
42-
self.check_recv_heart_beat_time()
46+
try:
47+
self.check_recv_heart_beat_time()
48+
except Exception:
49+
LoggerFactory.get_logger().error(traceback.format_exc())
4350

4451
def send_heart_beat(self):
4552
if self.is_running:

client/tcp_forward_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def handle_message(self, each: socket.socket, data: ResisterAppendData):
5151
if data.speed_limiter:
5252
data.speed_limiter.add(len(recv))
5353
except OSError as e:
54+
LoggerFactory.get_logger().error(f'{traceback.format_exc()}')
5455
LoggerFactory.get_logger().warn(f'get os error: {str(e)}, close')
5556
recv = b''
5657
send_message: MessageEntity = {

constant/system_constant.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ class SystemConstant:
1515

1616
COOKIE_EXPIRE_SECONDS = 3600 * 24
1717

18-
VERSION = '1.1.22'
18+
VERSION = '1.1.23'
1919

2020
GITHUB = 'https://github.com/sazima/proxynt'

run_client.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import json
23
import logging
34
import os
@@ -26,7 +27,6 @@
2627
from common.speed_limit import SpeedLimiter
2728
from common.websocket import WebSocketException, ABNF, WebSocketConnectionClosedException
2829

29-
from client.clear_nonce_task import ClearNonceTask
3030
from client.heart_beat_task import HeatBeatTask
3131
from client.tcp_forward_client import TcpForwardClient
3232
from common import websocket
@@ -246,13 +246,14 @@ def main():
246246
url += '?c=' + json.dumps(compress_support)
247247
ws = websocket.WebSocketApp(url)
248248
forward_client = TcpForwardClient(ws, compress_support)
249-
heart_beat_task = HeatBeatTask(ws)
249+
heart_beat_task = HeatBeatTask(ws, SystemConstant.HEART_BEAT_INTERVAL)
250250
WebsocketClient(ws, forward_client, heart_beat_task, config_data)
251251
LoggerFactory.get_logger().info('start run_forever')
252252
Thread(target=run_client, args=(ws,)).start() # 为了使用tornado的ioloop 方便设置超时
253-
ioloop.PeriodicCallback(heart_beat_task.run, SystemConstant.HEART_BEAT_INTERVAL * 1000).start()
254-
clear_nonce_stak = ClearNonceTask()
255-
ioloop.PeriodicCallback(clear_nonce_stak.run, 1800 * 1000).start()
253+
Thread(target=heart_beat_task.run).start()
254+
# ioloop.PeriodicCallback(heart_beat_task.run, SystemConstant.HEART_BEAT_INTERVAL * 1000).start()
255+
# clear_nonce_stak = ClearNonceTask()
256+
# ioloop.PeriodicCallback(clear_nonce_stak.run, 1800 * 1000).start()
256257
ioloop.IOLoop.current().start()
257258

258259

run_server.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import sys
77
import time
88
from optparse import OptionParser
9-
9+
from threading import Thread
1010

1111
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
1212

@@ -130,13 +130,13 @@ def main():
130130
app = tornado.web.Application(handlers, static_path=static_path, static_url_prefix=status_url_path, template_path=template_path)
131131
app.listen(ContextUtils.get_port(), chunk_size=65536 * 2)
132132
LoggerFactory.get_logger().info(f'start server at port {ContextUtils.get_port()}, websocket_path: {websocket_path}, admin_path: {admin_html_path}')
133-
heart_beat_task = HeartBeatTask(asyncio.get_event_loop())
134133
# create interval task
134+
heart_beat_task = HeartBeatTask(asyncio.get_event_loop(), SystemConstant.HEART_BEAT_INTERVAL)
135+
Thread(target=heart_beat_task.run).start()
135136
check_cookie_task = CheckCookieTask()
136-
tornado.ioloop.PeriodicCallback(heart_beat_task.run, SystemConstant.HEART_BEAT_INTERVAL * 1000).start()
137137
tornado.ioloop.PeriodicCallback(check_cookie_task.run, 3600 * 1000).start()
138-
clear_nonce_stak = ClearNonceTask()
139-
tornado.ioloop.PeriodicCallback(clear_nonce_stak.run, 1800 * 1000).start()
138+
# clear_nonce_stak = ClearNonceTask()
139+
# tornado.ioloop.PeriodicCallback(clear_nonce_stak.run, 1800 * 1000).start()
140140
tornado.ioloop.IOLoop.current().start()
141141

142142

server/task/heart_beat_task.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,21 @@
1212

1313

1414
class HeartBeatTask:
15-
def __init__(self, loop):
15+
def __init__(self, loop, break_time):
1616
self.loop = loop
17+
self.break_time = break_time
1718

18-
async def run(self):
19-
try:
20-
await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, self.send_heart_beat), timeout=20)
21-
except Exception:
22-
LoggerFactory.get_logger().error(traceback.format_exc())
23-
self.check_recv_heart_beat_time()
19+
def run(self):
20+
while True:
21+
time.sleep(self.break_time)
22+
try:
23+
self.send_heart_beat()
24+
except Exception:
25+
LoggerFactory.get_logger().error(traceback.format_exc())
26+
try:
27+
self.check_recv_heart_beat_time()
28+
except Exception:
29+
LoggerFactory.get_logger().error(traceback.format_exc())
2430

2531
def send_heart_beat(self):
2632
asyncio.set_event_loop(self.loop)

0 commit comments

Comments
 (0)