我尝试用 python 编写一个守护进程。但是我不知道如何在这个守护进程中使用线程来启动并行 tcp 服务器。甚至我应该使用什么类型的服务器:asyncore?SocketServer?socket?
这是我的代码的一部分:
import os
def demonized():
child_pid = os.fork()
if child_pid == 0:
child_pid = os.fork()
if child_pid == 0: #fork twice for demonize
file = open('###', "r") # open file
event = file.read()
while event:
#TODO check for changes put changes in list variable
event = file.read()
file.close()
else:
sys.exit(0)
else:
sys.exit(0)
if __name__ == "__main__":
demonized()
所以在一个循环中,我有一个列表变量,每个圆圈都附加了一些数据,我想用 tcp 服务器启动一个线程,等待循环中的连接,如果客户端连接,则向它发送此数据(带有清零变量)。所以我不需要处理多个客户端,客户端一次只有一个。实现这一点的最佳方式是什么?
谢谢。
最佳答案
如果你想避免重复样板文件,Python 很快就会有一个标准模块来执行 fork()
对和标准 I/O 操作(你还没有添加到你的程序中) ?)使它成为守护进程。您可以立即从以下网址下载并使用此模块:
http://pypi.python.org/pypi/python-daemon
在单独的线程中运行 TCP 服务器通常很简单:
import threading
def my_tcp_server():
sock = socket.socket(...)
sock.bind(...)
sock.listen()
while True:
conn, address = sock.accept()
...
... talk on the connection ...
...
conn.close()
def main():
...
threading.Thread(target=my_tcp_server).start()
...
我强烈建议反对尝试让您的文件读取器线程和套接字应答线程与您自己设计的列表和锁对话;这样的计划很难开始运作,也很难继续运作。相反,请使用标准库的 Queue.Queue()
类,它会为您正确执行所有锁定和附加操作。
关于python - 如何将tcp服务器放在python中的另一个线程上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8020287/