国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
簡介
select方法
實(shí)例:
#epoll方法:
epoll實(shí)例:
首頁 後端開發(fā) Python教學(xué) python教程之select模組介紹

python教程之select模組介紹

Aug 16, 2017 pm 01:49 PM
python select 介紹

簡介

Python中的select模組專注於I/O多路復(fù)用,提供了select ?poll ?epoll三個(gè)方法(其中後兩個(gè)在Linux中可用,windows僅支援select),另外也提供了kqueue方法(freeBSD系統(tǒng))

select方法

進(jìn)程指定核心監(jiān)聽哪些檔案描述子(最多監(jiān)聽1024個(gè)fd)的哪些事件,當(dāng)沒有檔案描述子事件發(fā)生時(shí),進(jìn)程被阻塞;當(dāng)一個(gè)或多個(gè)檔案描述符事件發(fā)生時(shí),進(jìn)程被喚醒。

當(dāng)我們呼叫select()時(shí):

  1、上下文切換轉(zhuǎn)換為核心態(tài)

  2、將fd從使用者空間複製到核心空間

  3、核心遍歷所有fd,查看其對應(yīng)事件是否發(fā)生

  4、如果沒發(fā)生,將進(jìn)程阻塞,當(dāng)設(shè)備驅(qū)動(dòng)產(chǎn)生中斷或timeout時(shí)間後,將進(jìn)程喚醒,再次進(jìn)行遍歷

  5、傳回遍歷後的fd

  6、將fd從核心空間複製到使用者空間

fd:file descriptor 檔案描述符

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

參數(shù): 可接受四個(gè)參數(shù)(前三個(gè)必須)

rlist: wait until ready for reading

wlist: wait until ready for writing

xlist: wait for an “exceptional condition”

timeout: 逾時(shí)時(shí)間

傳回值:三個(gè)清單

select方法用來監(jiān)視檔案描述子(當(dāng)檔案描述子條件不滿足時(shí),select會阻塞),當(dāng)某個(gè)檔案描述子狀態(tài)改變後,會回傳三個(gè)清單

? ? 1、當(dāng)參數(shù)1 序列中的fd滿足「可讀」條件時(shí),則取得發(fā)生變化的fd並加入fd_r_list中

? ? 2、當(dāng)參數(shù)2 序列中含有fd時(shí),則將該序列中所有的fd加入fd_w_list中

? ? 3、當(dāng)參數(shù)3 序列中的fd發(fā)生錯(cuò)誤時(shí),則將該發(fā)生錯(cuò)誤的fd加到fd_e_list中

? ? 4、當(dāng)逾時(shí)時(shí)間為空,則逾時(shí)時(shí)間為空,則逾時(shí)時(shí)間為空,則為空select會一直阻塞,直到監(jiān)聽的句柄發(fā)生變化

? ?當(dāng)超時(shí)時(shí)間= n(正整數(shù))時(shí),那麼如果監(jiān)聽的句柄均無任何變化,則select會阻塞n秒,之後返回三個(gè)空列表,如果監(jiān)聽的句柄有變化,則直接執(zhí)行。

實(shí)例:

利用select實(shí)作一個(gè)可並發(fā)的服務(wù)端

import socket
import select
 
s = socket.socket()
s.bind(('127.0.0.1',8888))
s.listen(5)
r_list = [s,]
num = 0
while 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 socket
 
flag = 1
s = 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()

在服務(wù)端我們可以看到,我們需要不停的呼叫select, 這就意味著:

  1 ?當(dāng)檔案描述子過多時(shí),檔案描述子在使用者空間與核心空間進(jìn)行copy會很費(fèi)時(shí)

  2 ?當(dāng)檔案描述子過多時(shí),核心對檔案描述子的遍歷也很浪費(fèi)時(shí)間

  3 ?select最大僅支援1024個(gè)檔案描述子

poll與select相差不大,本文不作介紹

#epoll方法:

#epoll很好的改進(jìn)了select:

  1、epoll的解決方案在epoll_ctl函數(shù)中。每次註冊新的事件到epoll句柄中時(shí),會把所有的fd拷貝進(jìn)內(nèi)核,而不是在epoll_wait的時(shí)候重複拷貝。 epoll保證了每個(gè)fd在整個(gè)過程中只會拷貝一次。

  2、epoll會在epoll_ctl時(shí)把指定的fd遍歷一遍(這一遍必不可少)並為每個(gè)fd指定一個(gè)回調(diào)函數(shù),當(dāng)設(shè)備就緒,喚醒等待隊(duì)列上的等待者時(shí),就會呼叫這個(gè)回呼函數(shù),而這個(gè)回呼函數(shù)會把就緒的fd加入一個(gè)就緒鍊錶。 epoll_wait的工作其實(shí)就是在這個(gè)就緒鍊錶中查看有沒有就緒的fd

  3、epoll對檔案描述子沒有額外限制

select.epoll(sizehint=-1, flags= 0) 建立epoll物件

?

epoll.close()

Close the control file descriptor of the epoll object.關(guān)閉epoll物件的檔案描述子

?

epoll.closed

True if the epoll object is closed.偵測epoll物件是否關(guān)閉

?

#epoll.fileno()

Return the file descriptor number of the control fd.傳回epoll物件的檔案描述子

?

epoll.fromfd(fd)

#Create an epoll object from a given file descriptor.根據(jù)指定的fd創(chuàng)建epoll物件

?

epoll.register(fd[, eventmask])

Register a fd descriptor with the epoll object.向epoll物件中註冊fd和對應(yīng)的事件

?

epoll.modify(fd, eventmask)

Modify a registered file descriptor.修改fd的事件

#?

epoll.unregister(fd)

Remove a registered file descriptor from the epoll object.取消註冊

?

#epoll.poll(timeout=-1, maxevents=-1)

Wait for events. timeout in seconds (float)阻塞,直到註冊的fd事件發(fā)生,會傳回一個(gè)dict,格式為:{(fd1,event1),(fd2,event2) ,……(fdn,eventn)}

事件:

EPOLLIN Available for read 可讀狀態(tài)符為1

EPOLLOUT Available for write 可寫狀態(tài)符為4

EPOLLPRI Urgent data for read

EPOLLERR Error condition happened on the assoc. fd 發(fā)生錯(cuò)誤狀態(tài)符號為8

EPOLLHUP Hang up happened on the assoc. fd

EPOLLHUP Hang up happened on the assoc. fd ####EPOL ##

EPOLLET Set Edge Trigger behavior, the default is Level Trigger behavior 默認(rèn)為水平觸發(fā),設(shè)置該事件后則邊緣觸發(fā)

EPOLLONESHOT Set one-shot behavior. After one event is pulled out, the fd is internally disabled

EPOLLRDNORM Equivalent to EPOLLIN

EPOLLRDBAND Priority data band can be read.

EPOLLWRNORM Equivalent to EPOLLOUT

EPOLLWRBAND Priority data may be written.

EPOLLMSG Ignored.

水平觸發(fā)和邊緣觸發(fā):

Level_triggered(水平觸發(fā),有時(shí)也稱條件觸發(fā)):當(dāng)被監(jiān)控的文件描述符上有可讀寫事件發(fā)生時(shí),epoll.poll()會通知處理程序去讀寫。如果這次沒有把數(shù)據(jù)一次性全部讀寫完(如讀寫緩沖區(qū)太小),那么下次調(diào)用 epoll.poll()時(shí),它還會通知你在上沒讀寫完的文件描述符上繼續(xù)讀寫,當(dāng)然如果你一直不去讀寫,它會一直通知你?。?!如果系統(tǒng)中有大量你不需要讀寫的就緒文件描述符,而它們每次都會返回,這樣會大大降低處理程序檢索自己關(guān)心的就緒文件描述符的效率?。?! 優(yōu)點(diǎn)很明顯:穩(wěn)定可靠

Edge_triggered(邊緣觸發(fā),有時(shí)也稱狀態(tài)觸發(fā)):當(dāng)被監(jiān)控的文件描述符上有可讀寫事件發(fā)生時(shí),epoll.poll()會通知處理程序去讀寫。如果這次沒有把數(shù)據(jù)全部讀寫完(如讀寫緩沖區(qū)太小),那么下次調(diào)用epoll.poll()時(shí),它不會通知你,也就是它只會通知你一次,直到該文件描述符上出現(xiàn)第二次可讀寫事件才會通知你?。?!這種模式比水平觸發(fā)效率高,系統(tǒng)不會充斥大量你不關(guān)心的就緒文件描述符?。?!缺點(diǎn):某些條件下不可靠

epoll實(shí)例:

import socket
import select
 
s = socket.socket()
s.bind(('127.0.0.1',8888))
s.listen(5)
epoll_obj = select.epoll()
epoll_obj.register(s,select.EPOLLIN)
connections = {}
while True:
 events = epoll_obj.poll()
 for fd, event in events:
  print(fd,event)
  if fd == s.fileno():
   conn, addr = s.accept()
   connections[conn.fileno()] = conn
   epoll_obj.register(conn,select.EPOLLIN)
   msg = conn.recv(200)
   conn.sendall('ok'.encode())
  else:
   try:
    fd_obj = connections[fd]
    msg = fd_obj.recv(200)
    fd_obj.sendall('ok'.encode())
   except BrokenPipeError:
    epoll_obj.unregister(fd)
    connections[fd].close()
    del connections[fd]
 
s.close()
epoll_obj.close()
import socket
 
flag = 1
s = 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()

以上是python教程之select模組介紹的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
PHP調(diào)用AI智能語音助手 PHP語音交互系統(tǒng)搭建 PHP調(diào)用AI智能語音助手 PHP語音交互系統(tǒng)搭建 Jul 25, 2025 pm 08:45 PM

用戶語音輸入通過前端JavaScript的MediaRecorderAPI捕獲並發(fā)送至PHP後端;2.PHP將音頻保存為臨時(shí)文件後調(diào)用STTAPI(如Google或百度語音識別)轉(zhuǎn)換為文本;3.PHP將文本發(fā)送至AI服務(wù)(如OpenAIGPT)獲取智能回復(fù);4.PHP再調(diào)用TTSAPI(如百度或Google語音合成)將回復(fù)轉(zhuǎn)為語音文件;5.PHP將語音文件流式返回前端播放,完成交互。整個(gè)流程由PHP主導(dǎo)數(shù)據(jù)流轉(zhuǎn)與錯(cuò)誤處理,確保各環(huán)節(jié)無縫銜接。

如何用PHP結(jié)合AI實(shí)現(xiàn)文本糾錯(cuò) PHP語法檢測與優(yōu)化 如何用PHP結(jié)合AI實(shí)現(xiàn)文本糾錯(cuò) PHP語法檢測與優(yōu)化 Jul 25, 2025 pm 08:57 PM

要實(shí)現(xiàn)PHP結(jié)合AI進(jìn)行文本糾錯(cuò)與語法優(yōu)化,需按以下步驟操作:1.選擇適合的AI模型或API,如百度、騰訊API或開源NLP庫;2.通過PHP的curl或Guzzle調(diào)用API並處理返回結(jié)果;3.在應(yīng)用中展示糾錯(cuò)信息並允許用戶選擇是否採納;4.使用php-l和PHP_CodeSniffer進(jìn)行語法檢測與代碼優(yōu)化;5.持續(xù)收集反饋並更新模型或規(guī)則以提升效果。選擇AIAPI時(shí)應(yīng)重點(diǎn)評估準(zhǔn)確率、響應(yīng)速度、價(jià)格及對PHP的支持。代碼優(yōu)化應(yīng)遵循PSR規(guī)範(fàn)、合理使用緩存、避免循環(huán)查詢、定期審查代碼,並藉助X

python seaborn關(guān)節(jié)圖示例 python seaborn關(guān)節(jié)圖示例 Jul 26, 2025 am 08:11 AM

使用Seaborn的jointplot可快速可視化兩個(gè)變量間的關(guān)係及各自分佈;2.基礎(chǔ)散點(diǎn)圖通過sns.jointplot(data=tips,x="total_bill",y="tip",kind="scatter")實(shí)現(xiàn),中心為散點(diǎn)圖,上下和右側(cè)顯示直方圖;3.添加回歸線和密度信息可用kind="reg",並結(jié)合marginal_kws設(shè)置邊緣圖樣式;4.數(shù)據(jù)量大時(shí)推薦kind="hex",用

PHP集成AI情感計(jì)算技術(shù) PHP用戶反饋智能分析 PHP集成AI情感計(jì)算技術(shù) PHP用戶反饋智能分析 Jul 25, 2025 pm 06:54 PM

要將AI情感計(jì)算技術(shù)融入PHP應(yīng)用,核心是利用雲(yún)服務(wù)AIAPI(如Google、AWS、Azure)進(jìn)行情感分析,通過HTTP請求發(fā)送文本並解析返回的JSON結(jié)果,將情感數(shù)據(jù)存入數(shù)據(jù)庫,從而實(shí)現(xiàn)用戶反饋的自動(dòng)化處理與數(shù)據(jù)洞察。具體步驟包括:1.選擇適合的AI情感分析API,綜合考慮準(zhǔn)確性、成本、語言支持和集成複雜度;2.使用Guzzle或curl發(fā)送請求,存儲情感分?jǐn)?shù)、標(biāo)籤及強(qiáng)度等信息;3.構(gòu)建可視化儀錶盤,支持優(yōu)先級排序、趨勢分析、產(chǎn)品迭代方向和用戶細(xì)分;4.應(yīng)對技術(shù)挑戰(zhàn),如API調(diào)用限制、數(shù)

python列表到字符串轉(zhuǎn)換示例 python列表到字符串轉(zhuǎn)換示例 Jul 26, 2025 am 08:00 AM

字符串列表可用join()方法合併,如''.join(words)得到"HelloworldfromPython";2.數(shù)字列表需先用map(str,numbers)或[str(x)forxinnumbers]轉(zhuǎn)為字符串後才能join;3.任意類型列表可直接用str()轉(zhuǎn)換為帶括號和引號的字符串,適用於調(diào)試;4.自定義格式可用生成器表達(dá)式結(jié)合join()實(shí)現(xiàn),如'|'.join(f"[{item}]"foriteminitems)輸出"[a]|[

Python連接到SQL Server PYODBC示例 Python連接到SQL Server PYODBC示例 Jul 30, 2025 am 02:53 AM

安裝pyodbc:使用pipinstallpyodbc命令安裝庫;2.連接SQLServer:通過pyodbc.connect()方法,使用包含DRIVER、SERVER、DATABASE、UID/PWD或Trusted_Connection的連接字符串,分別支持SQL身份驗(yàn)證或Windows身份驗(yàn)證;3.查看已安裝驅(qū)動(dòng):運(yùn)行pyodbc.drivers()並篩選含'SQLServer'的驅(qū)動(dòng)名,確保使用如'ODBCDriver17forSQLServer'等正確驅(qū)動(dòng)名稱;4.連接字符串關(guān)鍵參數(shù)

python pandas融化示例 python pandas融化示例 Jul 27, 2025 am 02:48 AM

pandas.melt()用於將寬格式數(shù)據(jù)轉(zhuǎn)為長格式,答案是通過指定id_vars保留標(biāo)識列、value_vars選擇需融化的列、var_name和value_name定義新列名,1.id_vars='Name'表示Name列不變,2.value_vars=['Math','English','Science']指定要融化的列,3.var_name='Subject'設(shè)置原列名的新列名,4.value_name='Score'設(shè)置原值的新列名,最終生成包含Name、Subject和Score三列

優(yōu)化用於內(nèi)存操作的Python 優(yōu)化用於內(nèi)存操作的Python Jul 28, 2025 am 03:22 AM

pythoncanbeoptimizedFormized-formemory-boundoperationsbyreducingOverHeadThroughGenerator,有效dattratsures,andManagingObjectLifetimes.first,useGeneratorSInsteadoFlistSteadoflistSteadoFocessLargedAtasetSoneItematatime,desceedingingLoadeGingloadInterveringerverneDraineNterveingerverneDraineNterveInterveIntMory.second.second.second.second,Choos,Choos

See all articles