OK the problem I posted about earlier is NOT a UDP/socket problem, it is
a threading problem. Albeit one that only happens when you have many
thrreads????

I have made two little scripts using the code I copied below, one client
and one server (attached).

If I run them concurrently on the same machine I see the following times:
>>1145526192.825508
<<1145526192.825848

>>1145526193.829325
<<1145526193.834927

a transfer time in the milliseconds. Much less than the times I see in
the full application.

OK so I put them both in a multithreaded script (also attached)


>>1145526971.619558
<<1145526971.619909

>>1145526972.619241
<<1145526972.619647

again transfer time in milliseconds.

Not like this that I get from the profile of my code:
<< 1145517554.363850 send
>> 1145517554.647485 recv

which uses the same communication and threading but has 20+ threads?

Now I am completely baffled!

again I really appreciate if anyone can shed light on this!

Paul


Paul Sijben wrote:
> I am stumped by the following problem. I have a large multi-threaded
> server accepting communications on one UDP port (chosen for its supposed
> speed).
> 
> I have been profiling the code and found that the UDP communication is
> my biggest drain on performance! Communication where the client and the
> server are on the same machine still takes 300ms or sometimes much more
> per packet on an Athlon64 3000+ running Linux (Fedora Core 5 x64).
> 
> I must be doing something wrong and would really appreciate feedback on
> my code below:
> 
> I open the server port with
> 
>       self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>       self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
>       self.s.bind((myaddress, myport))
> 
> I then open a client port with
> 
>       self.s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>       self.s.connect((host, port))
> 
> the client sends data with
> 
>       self.s.sendall(data)
> 
> and the server with
> 
>       self.s.sendto(data,link.remoteaddress)
> 
> both receive with
> 
> buf, address = socket.recvfrom(8192)
> 
> The sender and receiver are in separate threads (threading.Thread).
> 
> Does anyone know what is going wrong here, the socket communication, the
> thread scheduling?
> 
> Paul Sijben
> 

import socket
import time

profile=[]

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('127.0.0.1', 42420))
print ">>%f"%time.time()
s.sendall('testerdetest')
time.sleep(1)
print ">>%f"%time.time()
s.sendall('testerdetest')
print ">>%f"%time.time()
import socket
import time

profile=[]


s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 42420))


buf, address =s.recvfrom(8192)
print "<<%f"%time.time()
print buf, address
buf, address =s.recvfrom(8192)
print "<<%f"%time.time()
print buf, address
import socket
import time
import threading
profile=[]

class server(threading.Thread):
        def __init__(self):
                self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                self.s.bind(('', 42420))
                threading.Thread.__init__(self)
                self.start()
                
        def run(self):
                buf, address =self.s.recvfrom(8192)
                print "<<%f"%time.time()
                print buf, address
                buf, address =self.s.recvfrom(8192)
                print "<<%f"%time.time()
                print buf, address
                
class client(threading.Thread):
        def __init__(self):
                self.s =socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                self.s.connect(('127.0.0.1', 42420))
                threading.Thread.__init__(self)
                self.start()
                
        def run(self):
                print ">>%f"%time.time()
                self.s.sendall('testerdetest')
                time.sleep(1)
                print ">>%f"%time.time()
                self.s.sendall('testerdetest')
                print ">>%f"%time.time()
        

serv=server()
cl=client()
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to