我开发了一个代码,其中,我每秒从串口读取数据。相同的数据我必须发送数据到任何IP和端口,但具有特定的时间间隔如10s,30s等Python:插槽发送数据的时间间隔
那么如何告诉套接字去睡觉,它不会每秒发送数据?
我开发了一个代码,其中,我每秒从串口读取数据。相同的数据我必须发送数据到任何IP和端口,但具有特定的时间间隔如10s,30s等Python:插槽发送数据的时间间隔
那么如何告诉套接字去睡觉,它不会每秒发送数据?
import time
time.sleep(x)
X:以秒
睡眠时间你不需要告诉插座去睡觉,插座应始终听。你可以做的是让你的程序投票插座睡觉每一秒,像这样
import time
while(true):
sock.recv()
time.sleep(1)
或者,如果你想更冒险,您可以使用一个epoll的循环,这将检查,看看是否你的插座有什么接收。 epoll循环的一个很好的例子是http://scotdoyle.com/python-epoll-howto.html,但很可能不是必需的。只要你愿意看看,如果你开始进入套接字编程
感谢分享一些好东西,但我想在客户端而不是服务器端开发逻辑。 –
@MeetAdhia epoll循环既可以在客户端也可以在服务器端使用。说实话,我认为我们需要更多的信息来解决问题。您是否在收到后始终将相同的信息发送到IP和端口?它有没有必要改变?间隔是否改变或者始终保持不变? –
是的,我一直在向IP和端口发送数据。我已经通过使用多线程找到了解决我的问题的方法。 –
你将无法抑制你的套接字发送速率,唯一的解决方案将是限制对你的发送套接字的呼叫。首先,你需要做的是将接收到的数据放在一个容器中(看看to the python Queues),然后,你将不得不安排你的发送过程。你可以用这个Timer。 什么它可能看起来会是:
class Exchange(object):
def __init__(self):
#create the queue
#create the sockets
def receive_every_seconds_method(self):
# Here we put the received data into the queue
self.the_queue.put(self.receiving_socket.recv())
def send_data_later(self):
while not self.the_queue.empty():
self.emission_socket.send(self.the_queue.get())
# reschedule
self.schedule()
def schedule(self, timeout=30):
self.timer = Timer(timeout, self.send_data_later)
self.timer.start()
def run(self):
self.schedule(30)
while self.continue_the_job: #this is the stop condition
self.receive_every_seconds_method()
time.sleep(1)
这样一来,你就可以发送数据每30秒(如果有数据要发送)
你不能真正告诉插座去睡觉,你可以在其中创建一个带有睡眠的循环(time.sleep(..)),或者更好的方法是使用一个单独的线程/ pthread和一个堆栈,每隔X秒轮询一次数据,然后操作它(发送它或做你想做的任何事情),这样你不会锁定读线程 – Lucian