Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python Select()接收数据时出现明显延迟_Python_Multithreading_Sockets_Delay - Fatal编程技术网

使用Python Select()接收数据时出现明显延迟

使用Python Select()接收数据时出现明显延迟,python,multithreading,sockets,delay,Python,Multithreading,Sockets,Delay,我有一个Python脚本,用于从播放音频的机器接收与无线电台音频事件(如歌曲或广告)相关的数据。脚本将解析和处理数据,然后将部分数据发送到其他各种目的地 首先设置插座: client_socket_1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: print 'trying to open socket 1' client_socket_1.connect((TCP_RCV_IP_CR1, TCP_RCV_POR

我有一个Python脚本,用于从播放音频的机器接收与无线电台音频事件(如歌曲或广告)相关的数据。脚本将解析和处理数据,然后将部分数据发送到其他各种目的地

首先设置插座:

client_socket_1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    print 'trying to open socket 1'
    client_socket_1.connect((TCP_RCV_IP_CR1, TCP_RCV_PORT_CR1))
    client_socket_1.setblocking(0)
except socket.error, e:
    print 'Error', e, TCP_RCV_IP_CR1, '\n\n\n'
else:
    SOCK1 = 1
    print 'Successful connection to ',TCP_RCV_IP_CR1,'\n'
现在我们等待数据被读取。我使用了select(),当套接字准备好读取时,就会产生解析和处理数据的线程

ready_1 = select.select([client_socket_1], [], [], 1)   # select tells us when data is available at the socket
if ready_1[0] and SOCK1:        # Don't run this code if there is no connection on client_socket_1 or no data available
    t1 = Thread(target=processdata1)    # Set up the thread
    t1.start()  # Call the process to process available data as a thread
必须尽快读取数据,因为数据将通过TCP或UDP(取决于特定的数据块和程序规范)与相关音频一起传输,我们正在处理的其中一个数据项的功能可能会在音频中造成空中“打嗝”(如果未及时接收)。(TMI:它会导致接收端播放“替换”广告,该广告应该“覆盖”我们发送的商业音频。如果替换点启动不够快,听众将听到我们发送的广告的开头,那么本地替换广告将在接收到我们的数据时启动,听起来像一个h(我的杯子在空中。)

为了确认我的脚本并非总是能够足够快地接收数据,我将telnet连接到它正在侦听的端口,并在telnet窗口中观察数据的接收情况,然后查看Python输出(一旦接收到数据,它就会将接收到的数据发送到stdout)我看到telnet输出和Python输出之间大约有1.5秒的延迟。这与我们在正常空中操作中观察到的延迟量相同

我选择使用select()是因为我被要求对脚本执行多线程操作,我认为这是一种知道何时触发数据处理线程的好方法。我最初的想法是简单地循环尝试从我们监视的三个系统中读取数据,当发现数据时,对其进行处理

当时的想法是,如果一个系统正在处理数据,而另一个系统已经准备好读取数据,则可能会导致处理和从该机器发送数据的延迟。然而,我看不出延迟有我现在所经历的那么重要。我正在考虑回到原来的计划


我宁愿坚持我所拥有的一切,只要及时收到数据,这些工作就会完美无缺。关于延迟过长的原因有什么想法吗?

我认为这与您的
超时
参数以及
wlist
xlist
参数有关
考虑这段代码

write_list = []
exception_list = []
select.select([client_socket_1], write_list, exception_list)
它接受一个可选的超时参数,就像您使用它一样。文件上说

select()还接受可选的第四个参数,即数字 如果没有通道,则在中断监控之前等待的秒数 变得活跃起来。使用超时值可以让主程序调用select() 作为更大的处理循环的一部分,在这两者之间执行其他操作 检查网络输入

可能是因为列表为空,所以呼叫在返回之前将始终等待一秒钟。试一试

ready_1 = select.select(
    [client_socket_1], 
    [client_socket_1], 
    [client_socket_1], 1
)    
或者您可以使用0的超时值

指定轮询和从不阻塞


你这里有一个有趣的问题。在四处搜索之后,我在任何地方都找不到与
select
速度慢(在Python或操作系统级别)相关的帖子。因此,我认为你的问题其实在别处。我建议你试着多调试一点,或者写一篇文章,这样我们就可以试着帮点忙。你在哪个平台上运行代码?文件中说:
允许使用空序列,但接受三个空序列取决于平台。(大家都知道它可以在Unix上工作,但不能在Windows上工作。)
运行在Ubuntu Linux上。谢谢……先试试这个。我会回来报告的。由于昨天女儿生病,直到今天早上才能够测试出此解决方案。这似乎不是问题所在。我真的无法测量延迟的确切数量,但有时它似乎会稍微少一些,但它仍然很重要,足以成为一个问题。我确实尝试过用client_socket_1和超时0填充其他两个列表。