回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我为前面那篇冗长的帖子道歉。希望它能为解决方案提供足够的上下文。我试图创建一个实用程序函数,它将获取任意数量的旧<code>classmethod</code>并将它们放入多线程队列中:</p>
<pre><code>class QueuedCall(threading.Thread):
def __init__(self, name, queue, fn, args, cb):
threading.Thread.__init__(self)
self.name = name
self._cb = cb
self._fn = fn
self._queue = queue
self._args = args
self.daemon = True
self.start()
def run(self):
r = self._fn(*self._args) if self._args is not None \
else self._fn()
if self._cb is not None:
self._cb(self.name, r)
self._queue.task_done()
</code></pre>
<p>下面是我的调用代码(在类中)的外观</p>
<pre><code>data = {}
def __op_complete(name, r):
data[name] = r
q = Queue.Queue()
socket.setdefaulttimeout(5)
q.put(QueuedCall('twitter', q, Twitter.get_status, [5,], __op_complete))
q.put(QueuedCall('so_answers', q, StackExchange.get_answers,
['api.stackoverflow.com', 534476, 5], __op_complete))
q.put(QueuedCall('so_user', q, StackExchange.get_user_info,
['api.stackoverflow.com', 534476], __op_complete))
q.put(QueuedCall('p_answers', q, StackExchange.get_answers,
['api.programmers.stackexchange.com', 23901, 5], __op_complete))
q.put(QueuedCall('p_user', q, StackExchange.get_user_info,
['api.programmers.stackexchange.com', 23901], __op_complete))
q.put(QueuedCall('fb_image', q, Facebook.get_latest_picture, None, __op_complete))
q.join()
return data
</code></pre>
<p>我在这里遇到的问题是,在重新启动服务器时,它似乎每隔</em>一次就工作,但每秒钟或第三次请求都失败,并出现错误:</p>
<p><code>ValueError: task_done() called too many times</code></p>
<p>这个错误每隔一秒或第三次请求就会出现在一个随机线程中,所以很难准确地确定问题所在。</p>
<p>有人有什么想法和/或建议吗?</p>
<p>谢谢。</p>
<hr/>
<p><strong>编辑:</strong></p>
<p>我已经添加了<code>print</code>s来调试这个(快速和脏的而不是日志记录)。一个print语句(<code>print 'running thread: %s' % self.name</code>)在<code>run</code>的第一行,另一个在调用<code>task_done()</code>(<code>print 'thread done: %s' % self.name</code>)之前。</p>
<p>成功请求的输出:</p>
<pre><code>running thread: twitter
running thread: so_answers
running thread: so_user
running thread: p_answers
thread done: twitter
thread done: so_user
running thread: p_user
thread done: so_answers
running thread: fb_image
thread done: p_answers
thread done: p_user
thread done: fb_image
</code></pre>
<p>不成功请求的输出:</p>
<pre><code>running thread: twitter
running thread: so_answers
thread done: twitter
thread done: so_answers
running thread: so_user
thread done: so_user
running thread: p_answers
thread done: p_answers
Exception in thread p_answers:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/home/demian/src/www/projects/demianbrecht/demianbrecht/demianbrecht/helpers.py", line 37, in run
self._queue.task_done()
File "/usr/lib/python2.7/Queue.py", line 64, in task_done
raise ValueError('task_done() called too many times')
ValueError: task_done() called too many times
running thread: p_user
thread done: p_user
running thread: fb_image
thread done: fb_image
</code></pre>