2011-11-05 51 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字符串發送之前應該幫助。但我現在不能檢查它 –

相關問題