我開發了一個代碼,其中,我每秒從串口讀取數據。相同的數據我必須發送數據到任何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