我已经编写了一个脚本,该脚本可以运行一定的持续时间,并且可以更新此持续时间,并且程序应在运行更新的持续时间后终止。例如:如果我启动了一个运行60秒的程序,并且在这60秒过去之后运行,则我将该程序的持续时间更新为可以再运行30秒,那么它应该还可以再运行30秒。根据用户的请求,更新可以多次进行。我该怎么做?我尝试通过以下方式解决问题,但是它不起作用,即主线程没有退出:
服务器端代码:
#!/usr/bin/env python3
import socket
import threading
import time
from threading import Thread
class StoppableThread(Thread):
def __init__(self, *args, **kwargs):
super(StoppableThread, self).__init__(*args, **kwargs)
self._stop_event = threading.Event()
def stop(self):
self._stop_event.set()
def stopped(self):
return self._stop_event.is_set()
def killer(sleep_time):
for i in range(sleep_time):
print ("sleepin - %s" % i)
time.sleep(1)
t = StoppableThread(target=killer, args=(60,))
t.name = "killer_thread"
t.setDaemon(True)
t.start()
HOST = '127.0.0.1'
PORT = 65433
def foo(conn, addr):
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
print (data)
if not data:
break
for th in threading.enumerate():
if th.name == "killer_thread":
th.stop()
data = int(data)
if not data<20:
raise Exception
t = StoppableThread(target=killer, args=(data,))
t.name = "killer_thread"
t.setDaemon(True)
t.start()
conn.sendall(bytes(data))
def active_count_checker():
while True:
for i in enumerate():
print (i.name())
if threading.active_count() == 1:
exit(1)
if __name__ == "__main__":
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
while True:
conn, addr = s.accept()
threading.Thread(target=foo, args=(conn, addr)).start()
客户端代码:
#!/usr/bin/env python3
import socket
HOST = '127.0.0.1'
PORT = 65433
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'5')
data = s.recv(1024)
print('Received', repr(data))
使用全局变量extension
,并在获取新的time_interval
时对其进行更新。
def killer(sleep_time):
while sleep_time:
print ("sleeping - %s" % i)
time.sleep(1)
sleep_time += extension
extension = 0