Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

select()

最近流行の非同期ですが、pythonではどう書くのかなあと。
ってか普通にselectモジュールあるやん!
twistedの中身もselectやね。
どうもasync系はあんまし使わないっぽいらしい。
でサンプル

import socket 
import select

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 8080))
sock.listen(10)

read = [sock]
write = []
data = {}
adrs = {}

try:
    while 1:
        i, o, e = select.select(read, write, [])
        for x in i:
            if x is sock:
                newSock, addr = sock.accept()
                print "connect from " , addr
                read.append(newSock)
                adrs[newSock] = addr
            else:
                newData = x.recv(8192)
                if newData:
                    print "%s from %s" % (str(newData), adrs[x])
                    data[x] = data.get(x, '') + newData
                    if x not in write:
                        write.append(x)

                else:
                    print "disconnect from ", adrs[x]
                    del adrs[x]
                    write.remove(x)
                    x.close()

        for x in o:
            tosend = data.get(x)
            if tosend:
                n = x.send(tosend)
                print "%s to %s" % (str(tosend), adrs[x])
                tosend = tosend[n:]
            if tosend:
                print "%d bytes remain for %s " % (len(tosend), adrs[x])
                data[x] = tosend
            else:
                del data[x]
                write.remove(x)

finally:
    sock.close()

んーまあselect()はどんな言語でも似たような感じになりますよと。
うくく。