[Python] Multi-task Server in Python
2006-09-28 10:52:50| 分类:
lang_python
| 标签:
|举报
|字号大中小 订阅
用 Python 实现简单的多任务 Server 结构,常规的方法,无外乎下面三种:
1. Fork Server
2. Threading Server
3. Asynchronous I/O
何谓多任务,很简单,就是一个 server 可以同时服务于多个 client。下面就来讲解一下三种结构的基本原理。
-- Fork Server -- (仅适用 unix 环境)
fork
方式的思想很简单。在 unix 中,系统调用 fork 可以将克隆当前进程,将整个进程复制出来,并让两个进程一同执行。fork 方法主要适用于
HTTP 这样对单个用户提供的服务,比如 Apache 就是 fork server。Python 里面使用 fork 的方法如下:
while 1:
(clisock, addr_from) = server_sock.accept()
pid = os.fork()
if pid:
# Main process
clisock.close()
continue
else:
# Forked child process
server_sock.close()
do sth with clisock ...
-- Threading Server --
threading 可以看作是 fork 的简化版啦,呵呵。其中最令人头痛的就是 thread 之间的数据共享,需要 lock, semaphore ... 等等等等。Python 中 threading server 的基本形式如下:
def serv_client(client_socket):
pass
while 1:
(clisock, addr_from) = server_sock.accept()
thread.starts_new_thread(serv_client, clisock)
上面用的是 thread 来启动线程,也可以用 threading 来创建。
t = threading.Thread(target = thread_func, args = (sth...))
t.setDaemon(True)
t.start()
线程要停掉,目前比较好的方式是设一个标志,然后线程在运行时经常去查一查这个标志。另,如果想在主线程退出时,所有线程自动停掉,可以在创建线程对象后,调用setDaemon(True)将线程设置为Daemon,这样当主线程退出时,所有线程自动结束。
对于数据共享,threading 中有 Lock, RLock, Condition, Semaphore, Event 几种机制,具体使用可以参考附件的例子。
-- Threading Server --
评论这张
转发至微博
转发至微博
评论