1
2
3
4
5 import select
6 import fcntl
7 import os
8
11
12 self.fd = fd
13 fcntl.fcntl(self.fd.fileno(), fcntl.F_SETFL, os.O_NDELAY)
14
15 self.read_fd_set = []
16 self.write_fd_set = []
17 self.exc_fd_set = []
18 self.user_data = None
19 self.callback = None
20
21 - def set_callback(self, read_fd_set, write_fd_set, exc_fd_set,
22 user_data, callback):
23 self.read_fd_set = read_fd_set
24
25 for f in self.read_fd_set:
26 fcntl.fcntl(f.fileno(), fcntl.F_SETFL, os.O_NDELAY)
27
28 self.write_fd_set = write_fd_set
29 self.exc_fd_set = exc_fd_set
30 self.user_data = user_data
31 self.callback = callback
32
33 - def read(self, amt=0):
34 while 1:
35 status_changed = 0
36 readfds = self.read_fd_set + [self.fd]
37 writefds = self.write_fd_set
38 excfds = self.exc_fd_set
39 print("Calling select", readfds)
40 readfds, writefds, excfds = select.select(readfds, writefds, excfds)
41 print("Select returned", readfds, writefds, excfds)
42 if self.fd in readfds:
43
44
45
46 status_changed = 1
47 readfds.remove(self.fd)
48 if self.callback and (readfds or writefds or excfds):
49 self.callback(readfds, writefds, excfds, self.user_data)
50 if status_changed:
51 break
52 print("Returning")
53 return self.fd.read(amt)
54
57
59 return getattr(self.fd, name)
60
62 print("Callback called", r, w, e)
63 print(r[0].read())
64
65 if __name__ == '__main__':
66 import socket
67
68 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
69 s.connect(("localhost", 5555))
70 f = s.makefile()
71 ss = NonBlockingFile(f)
72
73 s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
74 s2.connect(("localhost", 5556))
75 f = s2.makefile()
76 ss.set_callback([f], [], [], None, callback)
77
78 xx = ss.read()
79 print(len(xx))
80