2

我尝试在 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 服务器启动一个线程,等待循环中的连接,如果客户端连接,则发送这个数据(带有归零变量)。所以我不需要处理多个客户端,客户端一次只有一个。实现这一点的最佳方法是什么?

谢谢你。

4

2 回答 2

6

如果您想避免重复样板,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()类,它会为您正确执行所有锁定和附加操作。

于 2011-11-05T14:03:40.837 回答
-1

您想将项目附加到while event:...循环中的列表并同时提供此列表吗?如果是这样,那么你有两个作家,你必须以某种方式保护你的名单。

在样本SocketServer.TCPServerthreading.Lock并被使用:

import threading
import SocketServer
import time


class DataHandler(SocketServer.StreamRequestHandler):

    def handle(self):
        self.server.list_block.acquire()
        self.wfile.write(', '.join(self.server.data))
        self.wfile.flush()
        self.server.data = []
        self.server.list_block.release()


if __name__ == '__main__':
    data = []
    list_block = threading.Lock()

    server = SocketServer.TCPServer(('localhost', 0), DataHandler)
    server.list_block = list_block
    server.data = data

    t = threading.Thread(target=server.serve_forever)
    t.start()

    while True:
        list_block.acquire()
        data.append(1)
        list_block.release()
        time.sleep(1)
于 2011-11-05T13:41:26.820 回答