Python学习笔记第十天

IO多路复用###

监听多个文件描述符

Linux####

select

#f = file(),obj = soket(),sys.stdin = 终端输入   
#监听用户输入   
#如果用户输入内容,select感知sys.stdin改变   
#将改变的文件句柄保存到列表,并将列表作为select第一个参数返回   
#如果用户未输入内容,   
#select第一个参数 = []


#[sys.stdin,]代表是个元组或列表


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()

IO操作###

文件 网络 tty
如要io 1连接 2操作

连接之后获取一个文件句柄
file,socket,sys.stdin

select监听文件句柄序列,当文件句柄序列变化后,select调用系统接口,得到变化的句柄列表

import socket
import select

ip_port = ('127.0.0.1',8888)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
    #
sk.setblocking(False)

sk1 = socket.socket()
sk1.bind(('127.0.0.1',9999))
sk1.listen(5)
sk1.setblocking(False)


while True:
		#sk服务器cocket对象
        rList,w,e = select.select([sk,sk1], [], [], 2)
        for r in rList:
	#conn客户端句柄 addr地址
            conn,address = r.accept()
            print address

读写一体都在rList

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author = 'han'

import socket
import select
import time

ip_port = ('127.0.0.1',8888)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
sk.setblocking(False)

inputs = [sk]

while True:

        rList,w,e = select.select(inputs, [], [], 0.05)
        time.sleep(2)
        print 'inputs:',inputs
        print 'resut:',rList
        for r in rList:

            if r == sk:

                conn,address = r.accept()
                inputs.append(conn)
                print address

            else:
                client_data = r.recv(1024)
                if client_data:
                    r.sendall(client_data)

                else:
                    inputs.remove(r)

读写分开

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author = 'han'

import socket
import select
import time

ip_port = ('127.0.0.1',8888)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
sk.setblocking(False)

inputs = [sk]
outputs = []

while True:

        rList,wList,e = select.select(inputs, outputs, [], 0.05)
        time.sleep(2)
        #print 'inputs:',inputs
        #print 'resut:',rList
        for r in rList:

            if r == sk:

                conn,address = r.accept()
                inputs.append(conn)


            else:
                client_data = r.recv(1024)
                if client_data:
                    outputs.append(r)

        print outputs
        for w in wList:
            w.sendall('123')
            outputs.remove(r)

队列

计算密集用多进程 IO密集用多线程

Twisted###

作业 线程池

greenlet

posted @ 2016-01-09 09:56  hallo.world  阅读(91)  评论(0)    收藏  举报