0

我一直在努力解决似乎是 Django/MySQL 之间的错误,但可能只是我自己对线程应用程序的细微差别等的误解。

首先,关于我的申请的一些信息。我有一个使用 Django 模型的用 python 编写的多线程应用程序。共有三种不同类型的线程通过使用队列在管道中提供信息。线程一从数据库中拉出一堆对象并将它们放入队列中。下一个线程(主要的主力)将项目从队列中取出并拉出一个 HTTP 请求并将其扔到第三个线程的队列中。第三个线程对 html 进行一些处理并更新一些数据库值。

这是奇怪的部分。我有一个名为“级别”的 mysql 列。第一个线程提取 level = 0 的行。解析 HTTP 响应后,最后一个线程应该更新数据库中 level = 1 的行以及从 HTTP 解析出的所有数据。全速运行时,脚本说它每分钟处理大约 1,000 个。但是 level = 1 的行数增加了大约 1/3。这是缓慢进行时问题的一些摘录。

显示正确输出的程序输出图片

重要的部分是写着“更新一级条目”的行。末尾的数字显示数据库中级别 1 的行数,后面是工作数据对象的当前“级别”状态。此输出是当它正常运行时。它是由这个代码块产生的:

# update our current record to reflect having run here
current.update = datetime.now()
# this prints out the "updating level one" text with debugging information
self.send_message(304, str(Scrape.objects.filter(level=1).count()) + ":" + str(current.level))
current.level = 1
current.save()
# and after saving the information to the db, prints it out again
self.send_message(304, str(Scrape.objects.filter(level=1).count()) + ":" + str(current.level))
self.send_message(308, str(current.asin)) # send out a consuming message

但是,运行一段时间后,我将得到基本相同的输出,除了 level = 1 的对象数量不会增加。这对我来说完全没有意义。如果之前的值是 = 0,现在是 = 1,那么它应该增加 level = 1 条目的数量!

我不相信这仅仅是缓存,更可能是我犯的错误或我正在使用的组件的某种意外行为。来自更有经验的眼睛的任何建议将不胜感激。

4

2 回答 2

0

想通了。这是填充要解析的项目队列的线程中的一个疏忽。它采用了匹配 level = 0 的前 30 个元素,忽略了它们可能已经在队列中但尚未处理的事实。愚蠢的错误太晚了,我猜。

于 2012-07-27T21:19:23.017 回答
0

我的直接猜测是交易问题。由于它们在不同的线程中运行,它们将有自己的事务,因此将受到事务隔离。即使进行更新的线程提交了它的事务并开始了一个新事务,输出计数的线程也不一定会看到该更新,直到它也开始一个新事务。

于 2012-07-27T13:17:21.337 回答