比如访问sqlite3, mysql, pgsql?以我现在的论坛为例,是sqlite3数据库,没有考虑异步的问题,因为发贴,查找等操作大都在1秒以内,在在线人数几十人的时候,不会出现什么问题。但接下来想加入统计方面的应用,需要连内网上的pgsql数据库服务器,执行复杂的sql语句。目前的情况,是不是若通过pgycopg2执行sql语句的话,就会阻塞其他协程?那有没有什么办法解决在一个用户需要统计几十秒的情况下,其他用户可以同时统计,或访问系统的其他部分?
--
您收到此邮件是因为您订阅了 Google 网上论坛的“eurasia-users”论坛。
要向此网上论坛发帖,请发送电子邮件至 eurasi...@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 eurasia-user...@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/eurasia-users?hl=zh-CN 访问此网上论坛。
PostgreSQL 库对异步的支持似乎比 MySQL 稍好,我回头写一个能在 eurasia 中
使用 PostgreSQL 的 “驱动”,届时请大家帮忙测试下。
from eurasia import core
from psycopg2 import extensions
def wait_callback(conn, timeout=-1):
file = core.file(conn.fileno())
while 1:
state = conn.poll()
if state == extensions.POLL_OK:
break
elif state == extensions.POLL_READ:
file.r_wait(timeout)
elif state == extensions.POLL_WRITE:
file.w_wait(timeout)
else:
raise psycopg2.OperationalError(
'Bad result from poll: %r' % state)
extensions.set_wait_callback(wait_callback)
装有 PostgreSQL 的朋友可以帮助测试一下。
On Sep 26, 8:51 am, Wilhelm Shen <wilei...@gmail.com> wrote:
> 老光提到的方法都有一定可行性。
>
> PostgreSQL 库对异步的支持似乎比 MySQL 稍好,我回头写一个能在 eurasia 中
> 使用 PostgreSQL 的 "驱动",届时请大家帮忙测试下。
>
> 在 2011年9月26日上午8:12,老光 <yaoguangm...@cq.chinatelecom.com.cn> 寫道:
>
>
>
> > 我对数据库异步访问有两种认识,不知哪一种是正确的,或是一种是另一种的包装?
>
> > A、psycopg2.connect.cursor.execute(sql,
> > callback),如你所说,带回调函数的调用execute方法。主线程执行此语句后,并不等待结果返回,而是往下执行。而该语句其实由其他线程(协程?) 执行,执行完毕后,会调用回调函数以进行结果传送。
>
> > B、异步仅相对于步面这种阻塞而言。就是execute(sql),执行到此一步后,程序会一直等待SQL执行完毕,处理结果。但是在等待过程中,不会将其他线 程(协程?)阻塞掉。
> > 只是这种情况,若第二个协程又需要访问数据库,那就是,一个协程能够独立完整处理一个数据库连接么? 还是一个进程总共只能打开一个数据库连接?
>
> > 甚至是设想是否有这种方式,为数据库添加异步访问接口?
> > 1、另外建立一个后台程序,从一个管道文件中IN中读取sql语句,依序将执行结果返回到另一个管道文件OUT。
> > 2、主程序中需要访问数据库时,将sql语句追加到管道文件IN中,然后无限循环读OUT文件,直到得到需要的结果。在每个循环之间sleep
> > 1毫秒(这个用eurasia改造的sleep,不会造成阻塞)
> > SQL语句会有加一个唯一id号以便每个协程据此查找自己的执行结果。
> > 3、如果数据库允许,后台程序可以开多进程或多线程,以并发执行多条SQL语句。
> > 这样看上去,主程序中的数据处理是象顺序独占一样,也绕开回调函数这种高技术问题,就实现了上面的B那种情况。
> > 不知我这个思路是否正确,可行?
> > 有时想起erlang中的进程进信息收发处理制度,就觉得那边真幸福。可惜我erlang也没入门也不准备学了。
>
> > ----- Original Message -----
>
> > From: keakon lolicon
> > To: eurasi...@googlegroups.com
> > Sent: Friday, September 23, 2011 7:20 PM
> > Subject: Re: [eurasia-users] 老大,eurasia的协程,能解决异步访问数据库么?
> > 最简单的办法就是维护一个连接数据库的线程池,查询完后回调。
> > MySQL据说不能异步访问,PostgreSQL可以:
> >http://initd.org/psycopg/docs/advanced.html#asynchronous-support
>
> > 2011/9/23 老光 <yaoguangm...@cq.chinatelecom.com.cn>
> 若有更多问题,请通过 http://groups.google.com/group/eurasia-users?hl=zh-CN 访问此网上论坛。
>
>
--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/
此外,Eurasia可否import gevent 用于实现和Redis的异步IO。 redis-py的库默认是unixsocket模式,消耗
句柄比较大,目前4000个持续并发就挂掉了
参考一下:多个异步服务器的测试 Tornado和Gevent 胜出 http://nichol.as/asynchronous-servers-in-python