0

我需要制作将在后台运行的脚本,脚本将始终打开与 memcached 服务器的连接并等待从其他程序获取参数,当接收参数脚本将做一些工作并将一些信息输出回第一个程序时。我最大的问题是如何使该脚本在后台运行并等待参数?

4

2 回答 2

0

在不确切知道您如何从其他程序获取参数或您如何等待的情况下,很难给出具体答案。

但是,为了说明起见,我们假设它正在侦听到端口 6789 的 TCP 连接,而另一个程序只是连接到该套接字并发送固定数量的参数,由换行符分隔。

最简单的方法是阻止:

memcache_connection = # however you set this up
sock = socket.socket()
sock.bind(('', 6789))
sock.listen(5)
while True:
    conn, addr = sock.accept()
    with contextlib.closing(conn) as client:
        with client.makefile() as f:
            param1, param2, param3 = f
        result = do_memcache_stuff(memcache_connection, param1, param2, param3)
        client.sendall(result)

显然这里没有错误处理,除了 ^C 之外没有其他方法可以退出,但是这些东西很容易添加。

更严重的是,它一次只能处理一个命令。如果这是一个问题,您通常有两种选择:线程或事件循环。如果您不需要在两个客户端连接之间共享信息并且一次不需要处理超过几十个,那么线程通常会更简单。您所要做的就是将处理程序包装在一个函数中,然后生成它。所以:

def handle_client(conn):
    with contextlib.closing(conn) as client:
        with client.makefile() as f:
            param1, param2, param3 = f
        result = do_memcache_stuff(memcache_connection, param1, param2, param3)
        client.sendall(result)

memcache_connection = # however you set this up
sock = socket.socket()
sock.bind(('', 6789))
sock.listen(5)
while True:
    conn, addr = sock.accept()
    t = threading.Thread(target=handle_client, args=(conn,))
    t.daemon = True
    t.start()
于 2013-03-01T22:30:06.933 回答
0

你想做所谓的多线程,在 python 文档中阅读它或自己尝试一下:

import threading
于 2013-03-02T11:48:05.650 回答