python - 如何编写一个在可配置时间段内存在的程序?
问题描述
我编写了一个运行一定时间的脚本,并且可以更新此持续时间,并且程序应该在运行更新的持续时间后终止。例如:如果我启动一个运行 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-1
extension = 0
推荐阅读
- hazelcast - 如何使用 Hazelcast 作为 bazel 的缓存后端
- java - 如何使用 Swing 计时器来延迟动作
- python - python dijkstra的算法使用类实现的可能问题
- flutter - Graphql_flutter runMutation 的 QueryResult 返回 null,尽管突变正在正确执行
- javascript - 如何从具有“复杂”信息的 JSON 文件中获取数据到数据表?
- ios - Cordova iOS 6.1.1 白色闪屏
- ruby - 添加 gem 'rails-controller-testing' 的替代方法
- python - 如何在 linux ubuntu 上安装 CUDA 10.1?
- javascript - 在 react.js 中将 prop 数据存储在本地存储中
- python - Pandas 合并列中的行