首页 > 解决方案 > 如何编写一个在可配置时间段内存在的程序?

问题描述

我编写了一个运行一定时间的脚本,并且可以更新此持续时间,并且程序应该在运行更新的持续时间后终止。例如:如果我启动一个运行 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))

标签: pythonasynchronous

解决方案


使用全局变量extension并在获得新的time_interval.

def killer(sleep_time):

    while sleep_time:
        print ("sleeping - %s" % i)
        time.sleep(1)
        sleep_time += extension-1
        extension = 0

推荐阅读