gpt4 book ai didi

python - 使用Python Select()接收数据的重大延迟

转载 作者:行者123 更新时间:2023-12-03 11:55:09 24 4
gpt4 key购买 nike

我有一个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(取决于特定的数据块和程序规范)以及相关的音频以及我们正在处理的数据项之一的功能进行传输如果未及时收到,可以在音频中创建广播“打cup”。 (TMI:这会导致在接收端播放“替换”的商业广告,该广告本应“覆盖”我们正在发送的商业音频。如果替换地点未快速启动,则听众将听到我们正在播放的商业广告的开头。发送,然后在收到我们的数据时开始本地替换,这听起来像是打了个小)。)

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

我之所以选择使用select()是因为我被要求对脚本进行多线程处理,并且我认为这将是知道何时触发数据处理线程的好方法。我最初的想法是简单地循环尝试从我们正在监视的三个系统中读取数据,并在找到数据后对其进行处理。

当时的想法是,如果在另一个系统准备读取数据时正在从一个系统处理数据,则可能会导致处理延迟以及从该计算机发送数据。但是,我看不到这种延误会像我现在遇到的那样严重。我正在考虑回到原来的计划。

我宁愿坚持我所拥有的一切,只要能够及时接收到数据,它们就可以完美地工作。有什么想法为什么要延迟太长的时间呢?

最佳答案

我认为这与您的timeout参数以及wlistxlist参数有关
考虑这段代码

write_list = []
exception_list = []
select.select([client_socket_1], write_list, exception_list)

就像您使用它一样,它需要一个可选的超时参数。该文件说

select() also takes an optional fourth parameter which is the number of seconds to wait before breaking off monitoring if no channels have become active. Using a timeout value lets a main program call select() as part of a larger processing loop, taking other actions in between checking for network input.



由于空列表,调用可能总是等待一秒钟再返回。尝试
ready_1 = select.select(
[client_socket_1],
[client_socket_1],
[client_socket_1], 1
)

或者您可以将超时值设置为0,即

specifies a poll and never blocks.

关于python - 使用Python Select()接收数据的重大延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com