garg10may
garg10may

Reputation: 6180

Monitor a socket connection

I have a socket connection which I want to monitor, it recevies market data with high burst.

while 1:
    socket.recv()        
    print('data recevied')

The while loop should only execute print, once in sixty seconds.

Upvotes: 0

Views: 560

Answers (2)

Serge Ballesta
Serge Ballesta

Reputation: 149155

You want some kind of asynchronous processing here: on one hand you want to continuously receive data, on the other hand you want to display a message every 60 seconds.

So threading would be my first idea: foreground display messages while background receives.

def recv_loop(socket, end_cond):
    while True:
        socket.recv(1024)
    # assuming something ends above loop
    end_cond[0] = True

end = False
recv_thr = threading.Thread(target = recv_loop, args = (socket,[end]), daemon = True)
recv_thr.start()
while not end:
    time.sleep(60)
    print('data received')

You haven't show any interesting data in the message, so I haven't either. But as all global variables are shared, it would be trivial to display for example the number of bytes received since last message

Alternatively, you could use select.select because it gives you a timeout. So you change threading for a more complex timeout processing.

last = datetime.datetime.now()
while True:
    timeout = (datetime.datetime.now() - last).seconds + 60
    if timeout <= 0:
        last = datetime.datetime.now()
        print("data received")
    rl, _, _ = select.select([socket], [], [], timeout)
    if (len(rl) > 0):
        sockect.recv(1024)

Upvotes: 0

user9455968
user9455968

Reputation:

Try this:

from datetime import datetime

last = datetime.now()
while 1:
    socket.recv()
    if (datetime.now() - last).seconds >= 60:
      print("data received")
      last = datetime.now()

Upvotes: 1

Related Questions