Примечание: это тесно связано с моей другой темой здесь и здесь , но это самостоятельный вопрос, и вам не нужно читать их, если вам это не интересно ..
У меня неожиданные задержки при обработке элементов из очереди. Похоже, это связано с потоком GUI matplotlib, потому что я могу сделать задержку произвольно долгой, избегая генерации каких-либо событий GUI, но, например, если я создаю некоторые события перемещения мыши, я могу попасть в очередь. В чем причина этой задержки и как ее исправить?
# ~/repo/wim/mpl_q.py
import threading, Queue, time, random, sys
t0 = time.time()
t = lambda : time.time() - t0
def worker():
while True:
thing = queue.get()
sys.stdout.write('({0}) hello {1}!\n'.format(t(), thing))
queue.task_done()
queue = Queue.Queue()
thread = threading.Thread(target=worker)
thread.daemon = True
thread.start()
def say_hello(thing='world'):
print '({0}) --> say_hello({1})'.format(t(), thing)
queue.put(thing)
say_hello('world')
say_hello('cruel world')
say_hello('stack overflow')
import matplotlib.pyplot as plt
fig = plt.figure()
def event_handler(event):
world = random.choice(['foo', 'bar', 'baz'])
say_hello(world)
event_handler_ = lambda x: event_handler(x)
cid0 = fig.canvas.mpl_connect('key_press_event', event_handler)
cid1 = fig.canvas.mpl_connect('button_press_event', event_handler_)
plt.show()
Пример типичного вывода, вы можете увидеть, что скриптовые элементы происходят вовремя, но созданные пользователем могут прийти намного позже ..
wim@wim-acer:~/repo/wim$ python mpl_q.py
(0.000166893005371) --> say_hello(world)
(0.000200986862183) --> say_hello(cruel world)
(0.000216960906982) hello world!
(0.000231027603149) --> say_hello(stack overflow)
(0.000247955322266) hello cruel world!
(0.00425505638123) hello stack overflow!
(7.80911588669) --> say_hello(foo)
(7.84842705727) hello foo!
(9.41998004913) --> say_hello(baz)
(11.4023530483) hello baz!
(14.3315930367) --> say_hello(foo)
(19.4317750931) hello foo!
(20.96124506) --> say_hello(bar)
(23.2277729511) --> say_hello(baz)
(23.2278220654) hello bar!
(29.0094120502) hello baz!
edit: я использую GTKAgg
backend и matplotlib версии 1.1.0