2017-07-25 52 views
1

我开发了一个代码,其中,我每秒从串口读取数据。相同的数据我必须发送数据到任何IP和端口,但具有特定的时间间隔如10s,30s等Python:插槽发送数据的时间间隔

那么如何告诉套接字去睡觉,它不会每秒发送数据?

+0

你不能真正告诉插座去睡觉,你可以在其中创建一个带有睡眠的循环(time.sleep(..)),或者更好的方法是使用一个单独的线程/ pthread和一个堆栈,每隔X秒轮询一次数据,然后操作它(发送它或做你想做的任何事情),这样你不会锁定读线程 – Lucian

回答

-1
import time 
time.sleep(x) 

X:以秒

2

睡眠时间你不需要告诉插座去睡觉,插座应始终听。你可以做的是让你的程序投票插座睡觉每一秒,像这样

import time 
while(true): 
    sock.recv() 
    time.sleep(1) 

或者,如果你想更冒险,您可以使用一个epoll的循环,这将检查,看看是否你的插座有什么接收。 epoll循环的一个很好的例子是http://scotdoyle.com/python-epoll-howto.html,但很可能不是必需的。只要你愿意看看,如果你开始进入套接字编程

+0

感谢分享一些好东西,但我想在客户端而不是服务器端开发逻辑。 –

+0

@MeetAdhia epoll循环既可以在客户端也可以在服务器端使用。说实话,我认为我们需要更多的信息来解决问题。您是否在收到后始终将相同的信息发送到IP和端口?它有没有必要改变?间隔是否改变或者始终保持不变? –

+0

是的,我一直在向IP和端口发送数据。我已经通过使用多线程找到了解决我的问题的方法。 –

0

你将无法抑制你的套接字发送速率,唯一的解决方案将是限制对你的发送套接字的呼叫。首先,你需要做的是将接收到的数据放在一个容器中(看看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秒(如果有数据要发送)