2013-04-30 111 views
1

我目前的工作在哪里客户端进行一些调用一个Web服务的应用程序,处理一些少量的数据返回的JSON完成,然后存储在数据库中。我目前正在使用Requests和SQLAlchemy。处理量非常小(只是将数据更改为更多关系格式)。我没有使用SA的ORM。我只是使用引擎+交易。的SQLAlchemy +请求的异步模式

我想知道的一个很好的方式来做到这一点异步会(请求返回 - >切换到数据库 - >下一个请求启动,而无需等待DB完成交易)。

我知道有一些在Python可用的工具(多线程,协程,asyncore等)。但是,我很难为我的用例找到一个很好的教程。

我想知道如果任何人有意见,图书馆我应该看看,或异步模式,会帮我解决这个问题。

谢谢。

+0

从我可以告诉,这是数据库做对自己有什么。 SQLAlchemy只是保持打开一个连接池,并在您使用数据库时使用它们。 – Blender 2013-04-30 03:36:23

+0

因此,无论事务有多大(可能有数千个插入),SA将允许线程移动到下一个请求? – 2013-04-30 04:04:09

回答

1

您可以推送Queue中的每个请求,并让一组工作人员threads处理每个请求并将它们推送到数据库。

这里是工人身上的一个简单的例子:

import threading 
import time 
from Queue import Queue, Empty 
from random import choice 

class worker(threading.Thread): 
    def __init__(self): 
    threading.Thread.__init__(self) 
    self.q = Queue() 
    def run(self): 
    while True: 
     try: 
     r = self.q.get_nowait() 
     except Empty: 
     r = None 
     if r is None: 
     time.sleep(1.0) 
     continue 
     # do something with 'r' 
     print '%s: Handled request %s' % (self, r) 
    def push(self, r): 
    self.q.put(r) 

workers = [worker() for i in range(5)] 
for w in workers: 
    w.start() 

然后分发这样的要求工人:

choice(workers).push(req) 
+0

谢谢。这很有帮助。我还想补充一点:http://www.nryoung.org/blog/2013/2/28/python-threading/是我今天上午发现的一篇有用的文章。 – 2013-04-30 17:50:53

+0

这是您的用例最常用的方法。另外,考虑接受我的答案,如果这是你正在寻找。 – mike 2013-05-01 08:03:38

+0

看起来像链接消失了。它移动到别的地方了吗? – ealeon 2015-04-19 02:24:39