Что может вызвать задержку в моем рабочем потоке Queue.get ()? - PullRequest
0 голосов
/ 24 августа 2011

Примечание: это тесно связано с моей другой темой здесь и здесь , но это самостоятельный вопрос, и вам не нужно читать их, если вам это не интересно ..

У меня неожиданные задержки при обработке элементов из очереди. Похоже, это связано с потоком 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

1 Ответ

1 голос
/ 24 августа 2011

Я не знаю почему, но проблема, похоже, исчезнет, ​​если вы объявите matplotlib.use(backend) перед импортом pyplot:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

В интерактивном сеансе эту проблему также можно избежатьвключив интерактивный режим:

import matplotlib.pyplot as plt
plt.ion()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...