簡體   English   中英

Python 的異步客戶端將定期數據發送到服務器

[英]Python's asyncore client to send periodic data to server

我需要連接到服務器(例如 smpp 服務器)並每 2 秒發送一次定期數據,代碼如下:

import asyncore, socket, threading, time

class SClient(asyncore.dispatcher):
    buffer = ""
    t = None

    def __init__(self, host):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect( (host, 25) )

        print "sending data from __init__"
        self.sendCommand("data_init")
        self.t = SenderThread(self)
        self.t.start()

    def sendCommand(self, command):
        self.buffer = command

    def handle_close(self):
        self.close()
        self.t.stop()

    def handle_read(self):
        print self.recv(8192)

    def writable(self):
        print 'asking for writable ? len='+str(len(self.buffer))
        return (len(self.buffer) > 0)

    def handle_write(self):
        print "writing to socket"
        sent = self.send(self.buffer)
        self.buffer = self.buffer[sent:]
        print "wrote "+str(sent)+" to socket"

class SenderThread(threading.Thread):
    _stop = False

    def __init__(self, client):
        super(SenderThread,self).__init__()
        self.client = client

    def stop(self):
        self._stop = True

    def run(self):
        counter = 0
        while self._stop == False:
            counter += 1
            time.sleep(1)
            if counter == 2:
                print "sending data from thread"
                self.client.sendCommand("data_thread")
                counter = 0

client = SClient('127.0.0.1')
asyncore.loop()

這是運行時的output:

$ python test.py 
sending data from __init__
asking for writable ? len=9
writing to socket
wrote 9 to socket
asking for writable ? len=0
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
asking for writable ? len=11
writing to socket
wrote 11 to socket
asking for writable ? len=0
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
asking for writable ? len=11
writing to socket
wrote 11 to socket
asking for writable ? len=0
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread
sending data from thread

我的線程通過緩沖區變量每 2 秒向服務器發送一次數據,但是 asyncore 每 1 分鍾准確地調用一次可寫和句柄寫入,我不明白為什么它在從線程中填充后不獲取緩沖區?

查看asyncore 循環方法的文檔。

timeout 參數為適當的 select() 或 poll() 調用設置超時參數,以秒為單位; 默認值為 30 秒。

它只是每 30 秒觸發一次 handle_write。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM