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 サーバーでスレッドを開始し、クライアントが接続した場合にこのデータを送信します (変数をゼロにします)。したがって、複数のクライアントを処理する必要はありません。クライアントは一度に 1 つだけになります。これを実装する最適な方法は何ですか?

ありがとうございました。

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:...ループ内のリストにアイテムを追加し、このリストを同時に提供しますか?もしそうなら、あなたには2人の作家がいて、どういうわけかあなたのリストを保護しなければなりません。

サンプル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 に答える