Асинхронный клиент Python для отправки периодических данных на сервер - PullRequest
2 голосов
/ 14 августа 2011

Мне нужно подключиться к серверу (например, серверу 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()

Вот вывод при запуске:

$ 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 вызывает writeable и handle_write ровно каждую 1 минуту, я не понимаю, почему он не извлекает буфер сразу после его заполнения из потока?

1 Ответ

1 голос
/ 14 августа 2011

Посмотрите документы для метода asyncore loop .

Аргумент времени ожидания устанавливает параметр времени ожидания для соответствующего вызов select () или poll (), измеряется в секундах; по умолчанию 30 секунд.

Он запускает handle_write только каждые 30 секунд.

...