老大,eurasia的协程,能解决异步访问数据库么?

120 views
Skip to first unread message

老光

unread,
Sep 23, 2011, 3:54:31 AM9/23/11
to eurasi...@googlegroups.com
比如访问sqlite3, mysql, pgsql?
 
以我现在的论坛为例,是sqlite3数据库,没有考虑异步的问题,因为发贴,查找等操作大都在1秒以内,在在线人数几十人的时候,不会出现什么问题。
 
但接下来想加入统计方面的应用,需要连内网上的pgsql数据库服务器,执行复杂的sql语句。目前的情况,是不是若通过pgycopg2执行sql语句的话,就会阻塞其他协程?那有没有什么办法解决在一个用户需要统计几十秒的情况下,其他用户可以同时统计,或访问系统的其他部分?
 
 

keakon lolicon

unread,
Sep 23, 2011, 7:20:03 AM9/23/11
to eurasi...@googlegroups.com
最简单的办法就是维护一个连接数据库的线程池,查询完后回调。

MySQL据说不能异步访问,PostgreSQL可以:
比如访问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 访问此网上论坛。

老光

unread,
Sep 26, 2011, 4:12:23 AM9/26/11
to eurasi...@googlegroups.com
我对数据库异步访问有两种认识,不知哪一种是正确的,或是一种是另一种的包装?
 
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 -----

Wilhelm Shen

unread,
Sep 26, 2011, 4:51:48 AM9/26/11
to eurasi...@googlegroups.com
老光提到的方法都有一定可行性。

PostgreSQL 库对异步的支持似乎比 MySQL 稍好,我回头写一个能在 eurasia 中
使用 PostgreSQL 的 “驱动”,届时请大家帮忙测试下。

沈崴

unread,
Sep 27, 2011, 3:02:42 AM9/27/11
to eurasia-users
在程序前面加上如下代码即可支持 PostgreeSQL:

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>

Zoom.Quiet

unread,
Sep 27, 2011, 4:48:59 AM9/27/11
to eurasi...@googlegroups.com
收录!
http://wiki.woodpecker.org.cn/moin/MiscItems/2011-09-27

> 若有更多问题,请通过 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/

Zero Fan

unread,
Oct 10, 2011, 6:36:31 AM10/10/11
to eurasia-users
有一个可能,用gevent-mysql的异步库实现独立server,不知道性能如何?http://github.com/mthurlin/
gevent-MySQL

此外,Eurasia可否import gevent 用于实现和Redis的异步IO。 redis-py的库默认是unixsocket模式,消耗
句柄比较大,目前4000个持续并发就挂掉了

参考一下:多个异步服务器的测试 Tornado和Gevent 胜出 http://nichol.as/asynchronous-servers-in-python

Reply all
Reply to author
Forward
0 new messages