mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-08-05 20:50:22 +03:00
Work around a bug where queue.Queue returns never-inserted lists
This commit is contained in:
parent
37570d8eee
commit
55789ca327
|
@ -755,12 +755,29 @@ class _ContainerQueue(queue.Queue):
|
||||||
|
|
||||||
result = [result]
|
result = [result]
|
||||||
while not self.empty():
|
while not self.empty():
|
||||||
item = self.get_nowait()
|
# TODO Is this a bug in Python? For some reason get_nowait()
|
||||||
if item == _reconnect_sentinel or\
|
# sometimes returns a *list* even when one was *never* put.
|
||||||
isinstance(item.obj, MessageContainer):
|
#
|
||||||
self.put_nowait(item)
|
# This can be seen by overriding `_put` to track if a list
|
||||||
break
|
# is ever inserted. The issue occurs when getting invoking
|
||||||
else:
|
# many requests at once (thus a lot of messages are put
|
||||||
result.append(item)
|
# really fast). With `_put` override it can be seen that
|
||||||
|
# no `list` is ever inserted but `get_nowait` may return it.
|
||||||
|
#
|
||||||
|
# If we use `self.queue.popleft()` it doesn't seem to occur
|
||||||
|
# which is the method that gets ultimately used.
|
||||||
|
#
|
||||||
|
# To work around that issue, always convert the result to
|
||||||
|
# a list, so if it's a list, we don't need to do anything.
|
||||||
|
items = self.get_nowait()
|
||||||
|
if not isinstance(items, list):
|
||||||
|
items = [items]
|
||||||
|
for item in items:
|
||||||
|
if item == _reconnect_sentinel or\
|
||||||
|
isinstance(item.obj, MessageContainer):
|
||||||
|
self.put_nowait(item)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
result.append(item)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
Loading…
Reference in New Issue
Block a user