线程池模式会牺牲并发能力, 但是 Eurasia3 服务器的性能
基本上还能维持。而且在 Eurasia3 中我们可以混合使用线程和
微线程, 在需要并发的时候使用微线程, 在需要 IO 的时候使用线程。
我们前面已经提到过线程池的实现。线程池在 Eurasia 的 shelve2
模块中:
from eurasia.shelve2 import Pool
代码也很简单:
class Pool:
def __init__(self, n=16):
self.queue = Queue()
for i in xrange(n):
start_new_thread(self.pipe, ())
def __call__(self, func):
def wrapper(*args, **kw):
e = channel()
self.queue.put((e, func, args, kw))
errno, e = e.receive()
if errno == 0:
return e
raise e
return wrapper
def pipe(self):
while True:
rst, func, args, kw = self.queue.get()
try:
result = func(*args, **kw)
except BaseException, e:
rst.send((-1, e))
else:
rst.send((0, result))
- EOF -
接下来, 我们就可以使用线程池来启动 Django 的
所有功能了!
#!/usr/bin/python2.5
#-*- coding: utf-8 -*-
# django 服务器启动脚本
import sys, os
sys.path.insert(0, '/PATH/TO/DJANGO/PROJECTS')
os.environ['DJANGO_SETTINGS_MODULE'] = 'SITE.settings'
from eurasia.cgietc import wsgi
from eurasia.shelve2 import Pool # 具体实现见上面
from eurasia import config, mainloop
from django.core.handlers.wsgi import WSGIHandler
threading = Pool(32) # 32 个线程
# 可以这么用
#
# @threading
# def handler(httpfile):
# ...
config(handler=threading(wsgi(WSGIHandler())), port=8080)
mainloop()
- EOF -
多进程与多线程混用目前还不稳定。我正在寻求一个稳定的实现。
目前已知在多线程模型下, handler 不能正常得到 Disconnect 异常,
此问题已在 svn 中更新, svn 用户可以直接 up。
哗,,,同理,可以用 Erasia3 支持所有拥有相同能力的框架了?!
唯一要求是: 支持 WSGI ?!
--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
向靠谱,反脑残! Kaopulity,小白退散!
嗯, 是的 :)
--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
一个人如果力求完善自己,就会看到:为此也必须同时完善他人. 一个人如果不关心别人的完善,自己便不可能完善!