2017-07-25 30 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秒(如果有數據要發送)