PYTHON+Twisted+sqlanydb=ABORT()

本教程将介绍PYTHON+Twisted+sqlanydb=ABORT()的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

PYTHON+Twisted+sqlanydb=ABORT() 教程 第1张

问题描述

我通过官方的sqlanydb驱动程序将Twisted 11和SQLAnywhere 12一起使用。

总的来说,它工作得很好。

但有时应用程序在第一次查询时会崩溃并中止。

如果一个查询起作用,则以下所有查询也起作用。然而,我的测试很少通过。

这开发起来很糟糕,strace也没有告诉我任何有用的东西。有时它在select()内崩溃,有时在mmap()内崩溃...

我运行的是64位Linux,在本地Sybase上以dbeng12身份运行以进行测试。

是否有人使用这些组件成功工作?有什么什么建议可以解决这个问题?我以前在Django上使用过sqlanydb,它从未崩溃过。

使用打印,我发现它在DeferredList内部崩溃,重要的代码基本上如下:

class WhoisDb(object):
 # ... shortened ...
 def _get_contacts(self, dom):
  if not dom:
self.d.errback(UnknownDomain(self._get_limit()))
return
  self.dom = Domain._make(dom[0])

  dl = defer.DeferredList( [
self.dbpool.runQuery(CON_SQL, (self.dom.dom_owner,)),
self.dbpool.runQuery(CON_SQL, (self.dom.dom_admin,)),
self.dbpool.runQuery(CON_SQL, (self.dom.dom_tech,)),
self.dbpool.runQuery(
 LAST_UPDATE_SQL,
 ( self.dom.domName, )), ] ).addCallback(self._fmt_string)

 def get_whois(self, domain):
  self.d = defer.Deferred()
  if not self._check_limit():
self.d.errback(LimitExceeded(MAX_PER_HOUR))
  elif not RE_ALLOWED_TLDS.match(domain):
self.d.errback(UnknownDomain(self._get_limit()))
  else: 
self.dbpool.runQuery(
  'select ' + DOM_FIELDS + ' from domains where '
  'domain = ? or domain_idn = ?',
  ( domain, domain, )) 
 .addCallback(self._get_contacts)

  return self.d

_FMT_STRING()如果崩溃,则不会调用。

在GDB中,它是一个简单的SIGSEV:

(gdb) run ~/.virtualenvs/whois/bin/trial test.test_protocol.ProtocolTestCase.test_correct_domain
Starting program: /home/hynek/.virtualenvs/whois/bin/python ~/.virtualenvs/whois/bin/trial test.test_protocol.ProtocolTestCase.test_correct_domain
[Thread debugging using libthread_db enabled]
test.test_protocol
  ProtocolTestCase
 test_correct_domain ... [New Thread 0x7ffff311a700 (LWP 6685)]
[New Thread 0x7ffff3099700 (LWP 6686)]
[New Thread 0x7ffff27dc700 (LWP 6723)]
[New Thread 0x7ffff1fdb700 (LWP 6724)]
[New Thread 0x7ffff17da700 (LWP 6725)]
[New Thread 0x7ffff0fd9700 (LWP 6729)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff1fdb700 (LWP 6724)]
0x00007ffff4d4167c in ?? () from /opt/sqlanywhere12/lib64/libdbcapi_r.so

推荐答案

您的数据库库似乎不是线程安全。为了使连接稳定,请执行以下操作:

self.dbpool = ConnectionPool(..., cp_min=1, cp_max=1)

这会将最大并发数设置为1,线程池将限制为1个线程,这意味着不会同时运行任何查询。这应该会阻止您的非线程安全库给您带来任何麻烦,同时仍然在线程中运行查询,并且不会阻塞主循环。

好了关于PYTHON+Twisted+sqlanydb=ABORT()的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。