使用多线程模式让 Eurasia3 全栈支持 Django

14 views
Skip to first unread message

沈崴

unread,
Apr 2, 2009, 7:03:00 AM4/2/09
to eurasia-users
通过 WSGI 我们可以将 Django 架设在 Eurasia3 上。
这样我们就得到了 Stackless Django, 我们可以在 Django 中用到
所有 stackless 的功能, 并且每个请求都是使用微线程来处理的。
这可以让 Django 的并发能力大幅提升, 并且提升性能。
这也带来一个问题, 为了遵守 stackless 微线程模型,
Django 中不能带有 IO 操作, 比如说数据库。
这意味着 Eurasia3 不是全栈支持 Django 的, 但是我们现在
可以通过线程池来实现对 Django 的全栈支持。

线程池模式会牺牲并发能力, 但是 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。

Zoom.Quiet

unread,
Apr 2, 2009, 7:57:01 AM4/2/09
to eurasi...@googlegroups.com
2009/4/2 沈崴 <wile...@gmail.com>:

> 通过 WSGI 我们可以将 Django 架设在 Eurasia3 上。

哗,,,同理,可以用 Erasia3 支持所有拥有相同能力的框架了?!
唯一要求是: 支持 WSGI ?!

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
向靠谱,反脑残! Kaopulity,小白退散!

沈崴

unread,
Apr 2, 2009, 7:59:26 AM4/2/09
to eurasia-users
On Apr 2, 7:57 pm, "Zoom.Quiet" <zoom.qu...@gmail.com> wrote:
> 2009/4/2 沈崴 <wilei...@gmail.com>:

>
> > 通过 WSGI 我们可以将 Django 架设在 Eurasia3 上。
>
> 哗,,,同理,可以用 Erasia3 支持所有拥有相同能力的框架了?!
> 唯一要求是: 支持 WSGI ?!

嗯, 是的 :)

Zoom.Quiet

unread,
Apr 2, 2009, 8:04:35 AM4/2/09
to eurasi...@googlegroups.com
2009/4/2 沈崴 <wile...@gmail.com>:

> On Apr 2, 7:57 pm, "Zoom.Quiet" <zoom.qu...@gmail.com> wrote:
>> 2009/4/2 沈崴 <wilei...@gmail.com>:
>>
>> > 通过 WSGI 我们可以将 Django 架设在 Eurasia3 上。
>>
>> 哗,,,同理,可以用 Erasia3 支持所有拥有相同能力的框架了?!
>> 唯一要求是: 支持 WSGI ?!
>
> 嗯, 是的 :)
>
赞!
这个比直接用 Eurasia 要COOL,,,,尝试...

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
一个人如果力求完善自己,就会看到:为此也必须同时完善他人. 一个人如果不关心别人的完善,自己便不可能完善!

Reply all
Reply to author
Forward
0 new messages