我有一个Python 2.7的应用程序,其中有3个生产者线程和1个消费者线程连接到Queue.queue
。我使用get
和put
,生产者线程大部分时间都被阻塞在IO(从串行端口读取)上,基本上什么也不做,就是调用serial.read()
。
然而,我似乎有一个我认为很高的延迟时间,即生产者线程放入队列到消费者线程获取队列的时间,大约25毫秒(我在Angstrom Linux上运行一个1 GHz的1处理器Beagle Bone Black)。
我认为,如果所有进程都被阻塞,那么put到get之间的经过时间应该非常小,只有几微秒左右,而不是几十毫秒,除非消费者线程实际上很忙(这里不是这种情况)。
我读了一些在线文章,有些文章提到Python有业务自旋的问题,Python中的GIL是罪魁祸首。我想我不想知道原因,只是想得到更快响应的东西。实际的串行传输延迟(大约1-2毫秒)我可以接受。
代码基本上看起来像这样:
q = Queue.queue
def a1():
while True:
p = read_serial_packet("/dev/ttyO1")
p.timestamp = time.time()
q.put(p)
def a2():
while True:
p = read_serial_packet("/dev/ttyO2")
p.timestamp = time.time()
q.put(p)
def a3():
while True:
p = read_serial_packet("/dev/ttyO3")
p.timestamp = time.time()
q.put(p)
def main():
while True:
p = q.get()
d = time.time() - p.timestamp
print str(d)
现在有4个线程在运行,分别是a1
、a2
、a3
和main
。
以下是一些示例时间:
0.0119640827179
0.0178141593933
0.0154139995575
0.0192430019379
0.0185649394989
0.0225830078125
0.018187046051
0.0234098434448
0.0208261013031
0.0254039764404
0.0257620811462
这个问题在Python 3中是否得到了“解决”?
q.put()
后插入了time.sleep(0)
。延迟仍然是 0.013 到 0.028 秒。它可能只削减了几毫秒。 - Mark Lakatap.get()
。我的测量对象是put()
和get()
之间的时间,而不是get()
和get()
之间的时间,后者包括处理接收到的对象的时间。 - Mark Lakatatime.time()
似乎是合理的。它可能不是纳秒级别精确的,但连续调用会在微秒级别上产生差异。我始终得到10毫秒左右的差值。 - Mark Lakataa1
向main
提供数据。 - Mark Lakata