【问题标题】:SQLAlchemy + Requests Asynchronous PatternSQLAlchemy + 请求异步模式
【发布时间】:2013-04-30 03:34:05
【问题描述】:

我目前正在开发一个应用程序,其中客户端对 Web 服务进行一些调用,对返回的 JSON 数据进行少量处理,然后将其存储在数据库中。我目前正在使用请求和 SQLAlchemy。处理量非常小(只是将数据更改为更相关的格式)。我没有使用 SA 的 ORM。我只是在使用引擎+事务。

我想知道异步执行此操作的好模式是什么(请求返回 -> 移交给数据库 -> 下一个请求开始而不等待数据库完成事务)。

我知道 Python 中有许多可用的工具(多处理、线程、协程、异步等)。但是,我很难为我的用例找到一个好的教程。

我想知道是否有人有可以帮助我解决此问题的建议、我应该查看的库或异步模式。

谢谢。

【问题讨论】:

  • 据我所知,这就是数据库自己做的事情。 SQLAlchemy 只是保持一个连接池打开并在您使用数据库时使用它们。
  • 所以无论事务有多大(可能是数千次插入),SA 都会允许线程移动到下一个请求?

标签: python sqlalchemy


【解决方案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)

【讨论】:

  • 谢谢。这很有帮助。我还想补充一点:nryoung.org/blog/2013/2/28/python-threading 是我今天早上发现的一篇有用的文章。
  • 这是您的用例最常用的方法。另外,如果这是您想要的,请考虑接受我的回答。
  • 链接好像不见了。它被转移到其他地方了吗?
猜你喜欢
  • 2018-10-07
  • 2021-02-09
  • 2012-03-19
  • 2015-09-17
  • 2017-11-23
  • 2013-12-05
  • 1970-01-01
  • 2014-07-13
  • 2014-11-01
相关资源
最近更新 更多