python 网络编程

 

1,什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,一条
线程指的是进程中一个单一个顺序的控制流,一个进程可以并发多个线程,每条线程并行执行不同的任务
简单的讲,是操作系统最小的调度单位,是一串指令的集合
2,进程
好比 QQ吧 要以一个整体的形式暴露给操作系统(OS)管理,里面包含对各种资源的调用,内存的管理
,网络接口的调用等。。
进程 要操作CPU,必须要先创建一个线程,进程本身是不可以执行的,进程只是一个房子而已 里面有一堆干活的线程
进程:对各种资源管理的集合, 就可以成为 进程


t=threading.Thread(target=函数名,arges=(参数,)) 声明一个线程
t.start() 开启线程
threading.current_thread()获取当前线程信息,

threading.active_count()当前活跃的进程数

t.join() 等待线程结束在继续执行

主线程和子线程是并行运算的


守护线程 一个主进线程可以生成很多守护线程,


在一个程序中大量使用锁的话 一定要使用递归锁防止锁死


生产者消费者模型,可解决大部分并发的程序
queue 队列 简介:
其实就是放一堆数据的盒子


gevent 协程概念
就是在单核,单线程的下实现并发操作,其实还是串行,只不过由于CPU处理快,协程跳的比较快 所以给人错觉是并行运算,

io操作不占用CPU
计算占用CPU ,1+1等

python 多线程 不适合CPU密集型的任务,适合IO操作密集型的任务

 

 

 

 

先上一个多线程的socket 支持多用户

 

import socketserver
# 想要使用socketserver 必须要定义一个类 并且继承socketserver.BaseRequestHandler
class Myserver(socketserver.BaseRequestHandler):
    # 这个方法就是父亲的,每链接一个对象就会调用一个handle
    def handle(self):
        # self.request == conn self.client_address == address self.server
        conn=self.request
        conn.sendall(bytes('欢迎光临',encoding='utf-8'))
        while True:
            ret_bytes=conn.recv(1024)
            ret_str=str(ret_bytes,encoding='utf-8')
            if ret_str =='q':
                break
            print(ret_str,self.client_address)
            conn.sendall(bytes(ret_str+'你好',encoding='utf-8'))
if __name__ == '__main__':
    server=socketserver.ThreadingTCPServer(('127.0.0.1',9999),Myserver)
    server.serve_forever() #他就是一个循环不停接收,他可以并发

再来个牛逼的支持上万个并发的(需要配置达得到)

"""
这模块很强大 ,它会监测操作系统 如果支持epoll 它会优先使用epoll
系统不支持 那他就会使用select
"""
sel=selectors.DefaultSelector()
# 建立连接
def accept(sock,mask):
    conn,addr=sock.accept()#接收连接
    print('accepted:',conn,',from:',addr)
    conn.setblocking(False)#设置非阻塞模式
    sel.register(conn,selectors.EVENT_READ,read)#注册事件,如果客户端发消息就会执行read了

def read(conn,mask):
    try:
        data=conn.recv(1024)
        if data:
            print('echoing',repr(data),'to',conn)
            conn.send(data)
        else:
            print('closing',conn)
            sel.unregister(conn)#取消注册
            conn.close()
    except Exception as e:
        print(e)
        sel.unregister(conn)  # 取消注册
        conn.close()

sock=socket.socket()
sock.bind(('127.0.0.1',1000))
sock.listen(10000)
sock.setblocking(False) #设置为非阻塞
sel.register(sock,selectors.EVENT_READ,accept)#注册事件,意思是只要来了新连接就调用accept函数
while True:
    events=sel.select()#这个有可能调用select 也有可能是epoll,默认是阻塞的,有活动的连接就返回活动的连接列表
    # 循环活动的连接列表
    for key,mask in events: #
        callback=key.data#回调函数 回调accept
        callback(key.fileobj,mask)#fileobje 文件句柄,就是还没建立好的连接

 

posted @ 2018-03-09 17:38  Never_Give_Up_WH  阅读(124)  评论(0)    收藏  举报