注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[Python] Multi-task Server in Python

2006-09-28 10:52:50|  分类: lang_python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
用 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 --

  评论这张
 
阅读(1269)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017