国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解python中的select模塊

2020-02-23 04:36:59
字體:
來源:轉載
供稿:網友

簡介

Python中的select模塊專注于I/O多路復用,提供了select  poll  epoll三個方法(其中后兩個在Linux中可用,windows僅支持select),另外也提供了kqueue方法(freeBSD系統)

select方法

進程指定內核監聽哪些文件描述符(最多監聽1024個fd)的哪些事件,當沒有文件描述符事件發生時,進程被阻塞;當一個或者多個文件描述符事件發生時,進程被喚醒。

當我們調用select()時:

  1、上下文切換轉換為內核態

  2、將fd從用戶空間復制到內核空間

  3、內核遍歷所有fd,查看其對應事件是否發生

  4、如果沒發生,將進程阻塞,當設備驅動產生中斷或者timeout時間后,將進程喚醒,再次進行遍歷

  5、返回遍歷后的fd

  6、將fd從內核空間復制到用戶空間

fd:file descriptor 文件描述符

fd_r_list, fd_w_list, fd_e_list = select.select(rlist, wlist, xlist, [timeout])

參數: 可接受四個參數(前三個必須)

rlist: wait until ready for reading wlist: wait until ready for writing xlist: wait for an “exceptional condition” timeout: 超時時間

返回值:三個列表

select方法用來監視文件描述符(當文件描述符條件不滿足時,select會阻塞),當某個文件描述符狀態改變后,會返回三個列表

    1、當參數1 序列中的fd滿足“可讀”條件時,則獲取發生變化的fd并添加到fd_r_list中

    2、當參數2 序列中含有fd時,則將該序列中所有的fd添加到 fd_w_list中

    3、當參數3 序列中的fd發生錯誤時,則將該發生錯誤的fd添加到 fd_e_list中

    4、當超時時間為空,則select會一直阻塞,直到監聽的句柄發生變化

   當超時時間 = n(正整數)時,那么如果監聽的句柄均無任何變化,則select會阻塞n秒,之后返回三個空列表,如果監聽的句柄有變化,則直接執行。

實例:利用select實現一個可并發的服務端

import socketimport selects = socket.socket()s.bind(('127.0.0.1',8888))s.listen(5)r_list = [s,]num = 0while True: rl, wl, error = select.select(r_list,[],[],10) num+=1 print('counts is %s'%num) print("rl's length is %s"%len(rl)) for fd in rl:  if fd == s:   conn, addr = fd.accept()   r_list.append(conn)   msg = conn.recv(200)   conn.sendall(('first----%s'%conn.fileno()).encode())  else:   try:    msg = fd.recv(200)    fd.sendall('second'.encode())   except ConnectionAbortedError:    r_list.remove(fd)s.close()
import socketflag = 1s = socket.socket()s.connect(('127.0.0.1',8888))while flag: input_msg = input('input>>>') if input_msg == '0':  break s.sendall(input_msg.encode()) msg = s.recv(1024) print(msg.decode())s.close()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 防城港市| 普兰店市| 页游| 隆回县| 碌曲县| 新闻| 永胜县| 灵川县| 马公市| 平顶山市| 南涧| 洪洞县| 额尔古纳市| 翼城县| 乌鲁木齐市| 淮安市| 枞阳县| 历史| 蒙山县| 嘉善县| 三穗县| 福州市| 沐川县| 台山市| 临漳县| 安溪县| 张家港市| 巴中市| 新竹市| 乌兰浩特市| 华池县| 阿鲁科尔沁旗| 珲春市| 尼玛县| 亚东县| 平远县| 博白县| 岗巴县| 纳雍县| 那坡县| 祁阳县|