python之路 IO多路复用 线程进程初步了解

一、IO多路复用

1、客户端

#!/usr/bin/env python
#-*-coding:utf-8-*-
import socket
sk=socket.socket()
sk.connect((‘127.0.0.1‘,8888,))
data=sk.recv(1024)
print(data)
while True:
    inp=input(‘>>>‘)
    sk.sendall(bytes(inp,encoding=‘utf-8‘))
    print(sk.recv(1024))
sk.close()

2、服务端

#!/usr/bin/env python
#-*-coding:utf-8-*-
import socket
import select
sk=socket.socket()
sk.bind((‘127.0.0.1‘,8888,))
sk.listen(5)

inputs=[sk,]
outputs=[]
messages={}
#del messages[张三]
#message={
#   张三:[消息1,消息2]
#       }
while True:
    rlist,wlist,e,=select.select(inputs,outputs,[],1)
    print(len(inputs),len(rlist),len(wlist),len(outputs))
    #监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端连接了,此时rlist值为[sk]
    #监听conn对象,如果conn发生变化,表示客户端有新消息发送过来了,此时rlist的值为[客户端]
    for r in rlist:
        if r==sk:
            #新客户来连接
            conn,address=r.accept()
            #conn是什么?其实是socket对象
            inputs.append(conn)
            messages[conn]=[]
            conn.sendall(bytes(‘hello‘,encoding=‘utf-8‘))
        else:
            #有人给我发消息
            # beta=r.recv(1024)
            print(‘==============‘)
            try:
                ret=r.recv(1024)
                if not ret:
                    raise Exception(‘断开连接‘)
                else:
                    outputs.append(r)
                    messages[r].append(ret)
            except Exception as e:
                inputs.remove(r)
                del messages[r]
    #所有给我发过消息的人
    for w in wlist:
        msg=messages[w].pop()
        resp=msg+bytes(‘response‘,encoding=‘utf-8‘)
        w.sendall(resp)
        outputs.remove(w)

二、线程

Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time

def show(arg):
    time.sleep(1)
    print ‘thread‘+str(arg)

for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print ‘main thread stop‘

上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。

更多方法:

    • start            线程准备就绪,等待CPU调度
    • setName      为线程设置名称
    • getName      获取线程名称
    • setDaemon   设置为后台线程或前台线程(默认)
                         如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
                          如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
    • join              逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义
    • run              线程被cpu调度后自动执行线程对象的run方法

自定义类程序

import threading
import time

class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num = num

    def run(self):#定义每个线程要运行的函数

        print("running on number:%s" %self.num)

        time.sleep(3)

if __name__ == ‘__main__‘:

    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()

线程锁(Lock、RLock)

由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,当多个线程同时修改同一条数据时可能会出现脏数据,所以,出现了线程锁 - 同一时刻允许一个线程执行操作。

未用锁:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time

gl_num = 0

def show(arg):
    global gl_num
    time.sleep(1)
    gl_num +=1
    print gl_num

for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print ‘main thread stop‘
#!/usr/bin/env python
#coding:utf-8

import threading
import time

gl_num = 0

lock = threading.RLock()

def Func():
    lock.acquire()
    global gl_num
    gl_num +=1
    time.sleep(1)
    print gl_num
    lock.release()

for i in range(10):
    t = threading.Thread(target=Func)
    t.start()
时间: 2024-12-28 09:15:47

python之路 IO多路复用 线程进程初步了解的相关文章

python中的IO多路复用

在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不必额外再创建进程或线程,也就不需要维护这些进程或线程,从而大大减小了系统的开销.当然,这三者不是孤立的,可以联合使用,效果可能更好. 了解了IO多路复用,我们就来看看python中是如何使用的.Python中有一个select模块,其中提供了:select.poll.epoll三个方法,分别调用系统

自动化运维Python系列之IO多路复用、SocketServer源码分析

IO多路复用 IO多路复用是指:通过一种机制,可以监视多个描述符,一旦某个系统描述符就绪(一般是读就绪或者写就绪)能够通知程序进行相应的读写操作 实例化例子就是在SocketServer模块中,客户端和服务端建立好连接,此时服务端通过监听conn这条链路,一旦客户端发送了数据,conn链路状态就发生变化,服务端就知道有数据要接收... Linux系统中同时存在select.pull.epoll三种IO多路复用机制 windows中只有select机制 1)select select本质上是通过设

【python之路36】线程相关

一.初始多线程 通过下面两个例子的运行效率,可以得知多线程的速度比单线程的要快很多 #!usr/bin/env python # -*- coding:utf-8 -*- import time def print_num(arg): time.sleep(1) print(arg) #每秒打印一个数字,速度非常慢 for i in range(10): print_num(i) #!usr/bin/env python # -*- coding:utf-8 -*- import time im

小白的python之路11/3内存 进程 二进制软件包 rpm yum

一 分区 查看swap分区 swapon -s mkswap /dev/sdb8 激活 swapon -a /dev/sdb8 swapon -s (sdb8进入了文件中) 提供内存服务 free (buffers cached) 查看所有系统信息 uname -a 当前操作系统版本 cat /etc/redhat.release free -m (以M为单位显示) swapon -s (查看swap分区) swapoff /dev/sdb8 (关闭sdb8分区) 二 进程一次动态执行 守护进程

python - seletors实现IO多路复用

服务端 from socket import * import selectors sel = selectors.DefaultSelector() def accept(server_fileobj, mask): conn, addr = server_fileobj.accept() sel.register(conn, selectors.EVENT_READ, read) def read(conn, mask): try: data = conn.recv(1024) if not

5Python全栈之路系列之IO多路复用

Python全栈之路系列之IO多路复用 What is IO Multiplexing? IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程. 举例说明 你是一名老师(线程),上课了(启动线程),这节课是自习课,学生都在自习,你也在教室里面坐着,只看着这帮学生,什么也不干(休眠状态),课程进行到一半时,A同学(socket)突然拉肚子,举手说:老湿我要上厕所(read),然后你就让他去了,过了一会,B同学(socket)在自习的过程中有个问题不太懂,就请你过去帮她

10-线程,进程,协程,IO多路复用

- 线程进程介绍 1. 工作最小单元是线程 2. 应用程序 -> 至少有一个进程 -> 至少有一个线程 3. 应用场景: IO密集型:线程 计算密集型:进程 4. GIL,全局解释器锁. - 保证同一个进程中只有一个线程同时被调度- 线程 1. 基本使用 def task(arg): time.sleep(arg) print(arg) for i in range(5): t = threading.Thread(target=task,args=[i,]) # t.setDaemon(Tr

39 - 同步-异步-IO多路复用

目录 1 同步与异步 2 阻塞与非阻塞 3 什么是IO 3.1 内核态用户态 3.2 IO两个阶段 3.3 IO模型 3.3.1 同步阻塞IO 3.3.2 同步非阻塞IO 3.3.3 IO多路复用 3.3.4 异步IO 4 Python中的IO多路复用 4.1 selectors库 4.2 register方法 4.3 利用selectors完成IO多路复用版本的EchoServer 4.4 聊天室 1 同步与异步 同步和异步关注的是程序在执行时的状态: 同步,可以理解为在执行完一个函数或方法之

IO多路复用深入浅出

前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信框架用的都不是异步IO模型,而是IO多路复 用中的epoll.因为Python提供了对Linux内核API的友好封装,所以我选择Python来学习IO多路复用. IO多路复用 select 举一个EchoServer的例子,客户端发送任何内容,服务端会原模原样返回. #!/usr/bin/env p