2011-11-05 29 views
2

我尝试用Python语言编写一个守护进程。但我不知道如何使用线程来启动此守护进程中的并行tcp服务器。甚至我应该使用什么类型的服务器:asyncore?SocketServer?socket?如何把TCP服务器上的另一个线程在python

这是我的代码部分:

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

谢谢。

+0

你可以只使用双绞线(http://twistedmatrix.com/trac/),它是专为基于网络的事件处理。 – extraneon

+0

的展示,最近对我帮助很大 - 我已经知道关于'Queue',但呈现给我介绍这样想'这是我的标准库文档已经看到,但不知道做什么用Event' - 大卫Beazley的“ “Python并发性简介” - 尽管大卫在专业培训方面,他已经慷慨地为每个人提供了很多幻灯片套件供他们看到: http://www.slideshare.net/dabeaz/an-introduction-to -python并发 –

回答

3

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

+0

谢谢。队列工作))) –

-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) 
+1

首先,这个解决方案应该使用一个'Queue'而不是建立一个从原语。其次,我不清楚它甚至运行 - Python不支持在列表对象上调用“write()”,是不是?我得到'TypeError:预期一个字符缓冲区对象'。 –

+0

@Kirill Teplinskiy它看起来像什么,我需要除'time.sleep(1)'我的文件可以改变比秒快时(我可以消失在这种情况下,一些信息)。是否有一些方法通过外部事件(打开连接到客户端)(不在循环内部)暂停'while循环?旗帜\信号灯? –

+0

@布兰登克雷格罗德斯我不知道,但可能转换data_list字符串发送之前应该帮助。但我现在不能检查它 –