在指定的时间之后如何结束线程?

问题描述 投票:0回答:1
当我运行此脚本时,它会按预期在端口上听。 我使用此脚本测试防火墙规则允许在这些端口上进行连接。 在另一个系统上,我执行

nc -zv my-host 50010

,该线程正在端口50010终止上侦听,这是我想要的。
,但我想进行两个改进:1)在x秒后,将线程死在X秒后,2)像守护程序一样将线程运行在后地面上,以便我的脚本将退出并使线程运行。
我一直在试图弄清楚这几天,我在哪里没有。 请帮忙!

	

,但我想进行两个改进:1)在x秒后,将线程死在X秒后,2)像守护程序一样将线程运行在后地面上,以便我的脚本将退出并使线程运行。

我想建议您真的不想做(2)。您可以将背景内容留在外壳中,而不必在代码中担心。这意味着您可以这样写代码:

#!/usr/bin/python3 import argparse import concurrent.futures import socket class Listener: def __init__(self, port: int, timeout: float = 10): self.port = port self.timeout = timeout def run(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(self.timeout) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(("", self.port)) s.listen(1) try: print(f"Waiting for connection on port {self.port}") conn, addr = s.accept() print(addr, conn) except TimeoutError: print(f"Listener on {self.port} timed out.") def main(): p = argparse.ArgumentParser() p.add_argument("--timeout", "-t", type=float, default=10) p.add_argument("ports", nargs="+", type=int) args = p.parse_args() pool = concurrent.futures.ThreadPoolExecutor() tasks = [] for port in args.ports: l = Listener(port, timeout=args.timeout) tasks.append(pool.submit(l.run)) concurrent.futures.wait(tasks) if __name__ == "__main__": main()
python multithreading sockets
1个回答
0
投票
python listener.py 100 200 300 &

如果您真的想处理代码中的背景,那么您可能会使用简单的

os.fork

而不是
daemonize
模块,因为您的目标不是真正写守护程序;您想要期望写入终端的东西。看起来像这样:

#!/usr/bin/python3 import socket import os class Listener: def __init__(self, port: int, timeout: float = 10): self.port = port self.timeout = timeout def run(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(self.timeout) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(("", self.port)) s.listen(1) try: print(f"Waiting for connection on port {self.port}") conn, addr = s.accept() print(addr, conn) except TimeoutError: print(f"Listener on {self.port} timed out.") def main(): p = argparse.ArgumentParser() p.add_argument("--timeout", "-t", type=float, default=10) p.add_argument("ports", nargs="+", type=int) args = p.parse_args() for port in args.ports: listener = Listener(port, timeout=args.timeout) pid = os.fork() if pid == 0: listener.run() return if __name__ == "__main__": main()
运行该代码(并连接到另一个终端的听力端口)看起来像这样:

$ python listener.py 2001 2002 2003 Waiting for connection on port 2001 Waiting for connection on port 2002 Waiting for connection on port 2003 $ ('127.0.0.1', 51466) <socket.socket fd=4, family=2, type=1, proto=0, laddr=('127.0.0.1', 2001), raddr=('127.0.0.1', 51466)> ('127.0.0.1', 44602) <socket.socket fd=4, family=2, type=1, proto=0, laddr=('127.0.0.1', 2002), raddr=('127.0.0.1', 44602)> ('127.0.0.1', 38672) <socket.socket fd=4, family=2, type=1, proto=0, laddr=('127.0.0.1', 2003), raddr=('127.0.0.1', 38672)>

如果您让听众暂时出去,看起来像:
$ py listener.py 2001 2002 2003
Waiting for connection on port 2001
Waiting for connection on port 2002
Waiting for connection on port 2003
$ Listener on 2003 timed out.
Listener on 2001 timed out.
Listener on 2002 timed out.

	

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.