[Twisted-Python] transport.write performance.

zipxing zipxing at hotmail.com
Tue Jul 30 02:58:17 MDT 2013


tsvr.py
-----------------------------------------------------------
import sys, time, random, socket, traceback
from twisted.internet import epollreactor
epollreactor.install()
from twisted.internet import defer, reactor, task
from twisted.internet.protocol import Protocol, Factory
from protocol import TCPServerProtocol

def main():
        tcpprotocol = TCPServerProtocol
        factory = Factory()
        factory.protocol = tcpprotocol
        reactor.listenTCP(9976, factory)
        reactor.run()

if __name__ == '__main__':
        main()

protocol.py
--------------------------------------------------------- 
import socket
import datetime
import traceback
from twisted.protocols.basic import LineReceiver
from twisted.internet import protocol

class TCPServerProtocol(LineReceiver):
        req_count = 0
        req_time = datetime.datetime.now()

        def lineReceived(self, data):
                TCPServerProtocol.req_count+=1
                if TCPServerProtocol.req_count%10000==0:
                        ct = datetime.datetime.now()
                        dt = ct-TCPServerProtocol.req_time
                        pps = 10000/(dt.seconds+dt.microseconds/1000000.0)
                        TCPServerProtocol.req_time=ct
                        print('RPS='+str(pps))
                try:
                        #self.transport.write(data)
                        self.transport.getHandle().send(data)
                except:
                        traceback.print_exc()

tcli.py 
-----------------------------------------------------------------
import sys
import socket
import traceback
import time
import datetime

host = 'localhost'
port = 9976
loopcount = 300
sockcount = 5000
RPS = 4000

ss=[]
for x in xrange(sockcount):
        ss.append(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
        ss[x].connect((host, port))
        ss[x].settimeout(120)

for x in xrange(10000000):
        st = datetime.datetime.now()
        for y in xrange(loopcount):
                try:
                        if ss[x%sockcount]!=None:
                                ss[x%sockcount].sendall('1234567890\r\n')
                                ss[x%sockcount].recv(1024)
                except:
                        print y
                        sys.exit()
        time.sleep(0.1)
        dt = (datetime.datetime.now()-st)
        plc = loopcount/(dt.seconds+dt.microseconds/1000000.0)
        print loopcount/(dt.seconds+dt.microseconds/1000000.0)
        #auto adjust RPS
        if plc<RPS:
                if RPS-plc>50:
                        loopcount+=10
        else:
                if plc-RPS>50:
                        loopcount-=10

echosvr.c 
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>

#include <event2/event.h>
#include <event2/bufferevent.h>

#define LISTEN_PORT 9976
#define LISTEN_BACKLOG 32

#ifdef FD_SETSIZE
#undef FD_SETSIZE
#endif
#define FD_SETSIZE 65536

void do_accept(evutil_socket_t listener, short event, void *arg);
void read_cb(struct bufferevent *bev, void *arg);
void error_cb(struct bufferevent *bev, short event, void *arg);
void write_cb(struct bufferevent *bev, void *arg);

int main(int argc, char *argv[])
{
    int ret;
    evutil_socket_t listener;
    listener = socket(AF_INET, SOCK_STREAM, 0);
    assert(listener> 0);
    evutil_make_listen_socket_reuseable(listener);

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = 0;
    sin.sin_port = htons(LISTEN_PORT);

    if (bind(listener, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        perror("bind");
        return 1;
    }

    if (listen(listener, LISTEN_BACKLOG) < 0) {
        perror("listen");
        return 1;
    }

    printf ("Listening...\n");

    evutil_make_socket_nonblocking(listener);

    struct event_base *base = event_base_new();
    assert(base != NULL);
    struct event *listen_event;
    listen_event = event_new(base, listener, EV_READ|EV_PERSIST, do_accept, (void*)base);
    event_add(listen_event, NULL);
    event_base_dispatch(base);

    printf("The End.");
    return 0;
}

void do_accept(evutil_socket_t listener, short event, void *arg)
{
    struct event_base *base = (struct event_base *)arg;
    evutil_socket_t fd;
    struct sockaddr_in sin;
    socklen_t slen;
    fd = accept(listener, (struct sockaddr *)&sin, &slen);
    if (fd < 0) {
        perror("accept");
        return;
    }
    if (fd> FD_SETSIZE) {
        perror("fd> FD_SETSIZE\n");
        return;
    }

    printf("ACCEPT: fd = %u\n", fd);

    struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);
    bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);
}

void read_cb(struct bufferevent *bev, void *arg)
{
#define MAX_LINE    256
    char line[MAX_LINE+1];
    int n;
    evutil_socket_t fd = bufferevent_getfd(bev);

    while (n = bufferevent_read(bev, line, MAX_LINE), n> 0) {
        line[n] = '\0';
        //printf("fd=%u, read line: %s\n", fd, line);

        bufferevent_write(bev, line, n);
    }
}

void write_cb(struct bufferevent *bev, void *arg) {}

void error_cb(struct bufferevent *bev, short event, void *arg)
{
    evutil_socket_t fd = bufferevent_getfd(bev);
    printf("fd = %u, ", fd);
    if (event & BEV_EVENT_TIMEOUT) {
        printf("Timed out\n"); //if bufferevent_set_timeouts() called
    }
    else if (event & BEV_EVENT_EOF) {
        printf("connection closed\n");
    }
    else if (event & BEV_EVENT_ERROR) {
        printf("some other error\n");
    }
    bufferevent_free(bev);
} 		 	   		  


More information about the Twisted-Python mailing list