python中有乙個select模組,其中提供了:select、poll、epoll三個方法,分別呼叫系統的 select,poll,epoll 從而實現io多路復用。
windows python:
提供: select
mac python:
提供: select
linux python:
提供: select、poll、epoll
注意:網路操作、檔案操作、終端操作等均屬於io操作,對於windows只支援socket操作,其他系統支援其他io操作,但是無法檢測 普通檔案操作 自動上次讀取是否已經變化。
對於select方法:
控制代碼列表11, 控制代碼列表22, 控制代碼列表33 = select.select(控制代碼序列1, 控制代碼序列2, 控制代碼序列3, 超時時間)
引數: 可接受四個引數(前三個必須)
返回值:三個列表
select方法用來監視檔案控制代碼,如果控制代碼發生變化,則獲取該控制代碼。
1、當 引數1 序列中的控制代碼發生可讀時(accetp和read),則獲取發生變化的控制代碼並新增到 返回值1 序列中
2、當 引數2 序列中含有控制代碼時,則將該序列中所有的控制代碼新增到 返回值2 序列中
3、當 引數3 序列中的控制代碼發生錯誤時,則將該發生錯誤的控制代碼新增到 返回值3 序列中
4、當 超時時間 未設定,則select會一直阻塞,直到監聽的控制代碼發生變化
當 超時時間 = 1時,那麼如果監聽的控制代碼均無任何變化,則select會阻塞 1 秒,之後返回三個空列表,如果監聽的控制代碼有變化,則直接執行。
利用select監聽終端操作例項
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import select
import threading
import sys
while true:
readable, writeable, error = select.select([sys.stdin,],,,1)
if sys.stdin in readable:
print 'select get stdin',sys.stdin.readline()
利用select實現偽同時處理多個socket客戶端請求:服務端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import select
sk1 = socket.socket(socket.af_inet, socket.sock_stream)
sk1.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
sk1.bind(('127.0.0.1',8002))
sk1.listen(5)
sk1.setblocking(0)
inputs = [sk1,]
while true:
readable_list, writeable_list, error_list = select.select(inputs, , inputs, 1)
for r in readable_list:
# 當客戶端第一次連線服務端時
if sk1 == r:
print 'accept'
request, address = r.accept()
request.setblocking(0)
# 當客戶端連線上服務端之後,再次傳送資料時
else:
received = r.recv(1024)
# 當正常接收客戶端傳送的資料時
if received:
print 'received data:', received
# 當客戶端關閉程式時
else:
inputs.remove(r)
sk1.close()
利用select實現偽同時處理多個socket客戶端請求:客戶端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',8002)
sk = socket.socket()
sk.connect(ip_port)
while true:
inp = raw_input('please input:')
sk.sendall(inp)
sk.close()
執行結果:
客戶端輸入
服務端接收
說明:此處的socket服務端相比與原生的socket,他支援當某乙個請求不再傳送資料時,伺服器端不會等待而是可以去處理其他請求的資料。但是,如果每個請求的耗時比較長時,select版本的伺服器端也無法完成同時操作。
python怎麼取模 Python中的取模運算方法
所謂取模運算,就是計算兩個數相除之後的餘數,符號是 如a b就是計算a除以b的餘數。用數學語言來描述,就是如果存在整數n和m,其中0 m b,使得a n b m,那麼a b a n b m.取模運算的兩個運算元都必須是整數,可以是負整數,但是b不可以是0,因為被除數不能為0嘛。當a和b中存在負整數時...
vxworks下select 的使用
select 作用是掛起一系列的檔案描述符,其api為 int select int width,number of bits to examine from 0 fd set preadfds,read fds fd set pwritefds,write fds fd set pexceptfd...
linux下的Select函式
part1 fd set errorfds同上面兩個引數的意圖,用來監視檔案錯誤異常。struct timeval timeout是select的超時時間,這個引數至關重要,它可以使select處於三種狀態,第一,若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視...