AsyncSocket - asynchronous ftplib, urllib, ... benutzen
Verfasst: Donnerstag 17. April 2008, 21:42
bin noch nicht fertig
die idee ist code, das fuer blockende sockets geschrieben wurde asynchronous zu benutzen
der ansatz liegt daran, die zeit, die recv() blockt sinnvoll mit anderen verbindungen zu verbringen
schaft es nhemand dies sauber mit xml-rpc, httplib, etc zu verbinden?
bye bye twisted?
die idee ist code, das fuer blockende sockets geschrieben wurde asynchronous zu benutzen
der ansatz liegt daran, die zeit, die recv() blockt sinnvoll mit anderen verbindungen zu verbringen
schaft es nhemand dies sauber mit xml-rpc, httplib, etc zu verbinden?
bye bye twisted?
Code: Alles auswählen
import asyncore
from time import sleep
SLEEPTIME = 0.01
class AsyncSocketManager(list):
def __init__(self):
list.__init__(self)
def update(self):
if self:
self.pop(0)()
asyncore.loop(count=1)
def mainloop(self):
while True:
self.update()
sleep(SLEEPTIME)
def get_socket(self):
async_sock_mngr_obj = self
class AsyncSocket(asyncore.dispatcher):
def __init__(self, sarg1, sarg2, sproto=None):
asyncore.dispatcher.__init__(self)
#hiermit wird implizit self.socket erstellt!
self.create_socket(sarg1, sarg2) #asyncore bug? - create_socket does not accept any proto arg
self.outbuffer = ''
self.inbuffer = ''
self.isclosed = False
def send(self, data):
self.outbuffer += data #append waere performanter...
def writable(self):
return (len(self.outbuffer) > 0)
def handle_write(self):
#if self.isclosed: #wieso wurde ich nicht ausortiert?
# return
sent = self.socket.send(self.outbuffer)
self.outbuffer = self.outbuffer[sent:]
def handle_read(self):
buffer = self.socket.recv(2048)
self.inbuffer += buffer
def recv(self, howmuch):
while len(self.inbuffer) < howmuch:
if self.isclosed:
return self.inbuffer
async_sock_mngr_obj.update()
sleep(SLEEPTIME)
retval = self.inbuffer[:howmuch]
self.inbuffer = self.inbuffer[howmuch:]
return retval
def handle_close(self):
self.isclosed = True
def handle_connect(self):
pass
return AsyncSocket
from socket import AF_INET, SOCK_STREAM
## expose all socket stuff
#
#__all__ = []
#import socket as real_socket
#for attr in dir(real_socket):
# __all__.append(getattr(real_socket, attr))
#_fileobject = real_socket._fileobject
#print real_socket.SLEEPTIME
#error = real_socket.error
_a = AsyncSocketManager()
socket = _a.get_socket()
append = _a.append
update = _a.update
if __name__ == '__main__':
def http_get():
s = socket(AF_INET, SOCK_STREAM)
s.connect(('www.test.de', 80))
s.send('GET / HTTP/1.0\r\n\r\n')
print s.recv(1024)
for i in range(40):
append(http_get)
update()