【select模块】select IO多路复用和select实现FTP
select是全平台通用的IO多路复用模块。最大连接数:1024。
poll和epoll没有最大连接数限制,但只能用在linux平台。
selectors是再封装模块,推荐使用。下篇会讨论。
select.select
(rlist, wlist, xlist[, timeout])¶
This is a straightforward interface to the Unix select()
system call. The first three arguments are sequences of ‘waitable objects’: either integers representing file descriptors or objects with a parameterless method named fileno()
returning such an integer:
Empty sequences are allowed, but acceptance of three empty sequences is platform-dependent. (It is known to work on Unix but not on Windows.) The optional timeout argument specifies a time-out as a floating point number in seconds. When the timeout argument is omitted the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks.
The return value is a triple of lists of objects that are ready: subsets of the first three arguments. When the time-out is reached without a file descriptor becoming ready, three empty lists are returned.
Among the acceptable object types in the sequences are Python file objects (e.g. sys.stdin
, or objects returned by open()
or os.popen()
), socket objects returned by socket.socket()
. You may also define a wrapper class yourself, as long as it
rlist: wait until ready for reading
wlist: wait until ready for writing
xlist: wait for an “exceptional condition” (see the manual page for what your system considers such a condition)
方法、属性参数作用示例select(rlist,wlist,rlist,[timout=1])poll()
没人用了,已经升级为epoll
epoll(sizehint = -1,flags=0)
sizehint informs epoll about the expected number of events to be registered. It must be positive, or-1to use the default. It is only used on older systems where epoll_create1()
is not available; otherwise it has no effect (though its value is still checked).
flags is deprecated and completely ignored. However, when supplied, its value must be 0
or select.EPOLL_CLOEXEC
, otherwise OSError
is raised.
(Only supported on Linux 2.5.44 and newer.) Return an edge polling object, which can be used as Edge or Level Triggered interface for I/O events.
devpoll()
(Only supported on Solaris and derivatives.) Returns a
/dev/poll
polling object; see section /dev/poll Polling Objects below for the methods supported by devpoll objects.kevent()
select.
kevent
(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶(Only supported on BSD.) Returns a kernel event object; see section Kevent Objects below for the methods supported by kevent objects.
kqueue()
(Only supported on BSD.) Returns a kernel queue object; see section Kqueue Objects below for the methods supported by kqueue objects.
importsocketimportosimportselectimportqueueimportjsonclassSelectFTP(object):def__init__(self,ip,port):self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.server.setblocking(0)self.server.bind((ip,port))self.server.listen(20)self.inputs=[self.server]self.outputs=[]self.file_attr={}#file_attrformat:file_attr[socket]:{func:'',filename:'',len:999,recv_len:0}self.socket_queue={}defupload(self,sock,write_data):#ifos.path.isfile(self.file_attr[sock]['filename']):withopen(self.file_attr[sock]['filename'],'a+')asfile:file.write(data)self.file_attr[sock][recv_len]+=len(write_data)ifself.file_attr[sock][recv_len]==self.file_attr[sock][len]:delself.file_attr[sock]file.close()defdownload(self,sock,*args):passdefrun(self):whileself.inputs:read_active,read_output,exception=select.select(self.inputs,self.outputs,self.inputs)forfdinread_active:iffdisserver:conn,addr=fd.accept(1024)conn.setblocking(0)self.inputs=self.inputs.append(conn)self.socket_queue[fd]=queue.Queue()else:recv_data=fd.recv(1024)ifrecv_data:data=json.loads(recv_data.decode())iffdnotinself.file_attr.keys:self.file_attr[fd]=dataelse:try:self.socket_queue.put_nowait(data)iffdnotinself.outputs:self.outputs.append(fd)exceptExceptionase:print(e)else:self.inputs.remove(fd)iffdinself.outputs:self.outputs.remove(fd)delself.socket_queue[fd]send_data=forfdinread_output:try:message=self.socket_queue.get_nowait()exceptqueue.Empty:self.outputs.remove(fd)print('wait...')else:getattr(self.file_attr[fd]['func'])(fd,message)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。