Python学习并发与多线程

1、并发

1.1、并发与并行

并行,parallel,同一时刻,执行不同任务,并且相互没有干扰;

并发,concurrency,一段时间内,交替执行不同的任务;

串行,一个任务执行完成后执行下一个任务;

1.2、并发的解决方法

“高并发模型”:例如早高峰的北京地铁,在同一时刻,需要处理大量任务,可以理解为高并发模型;

解决方法:

(1)队列,缓冲区:将任务排队,形成队列,先进先出,就解决了资源的使用问题;形成的队列其实就是一个缓冲区域,假设排队有一种优先机制,例如女士优先,则次队列为优先对列;

(2)争抢:谁抢到资源就上锁,排他性的锁,其他任务只能等待;争抢是一种高并发的解决方案,但是这样不好,因为可能有任务长期霸占资源,有人一直抢不到资源;

(3)预处理:将各个任务会用到的热点数据提前缓存,这样就减少了任务的执行时间;

(4)并行:开辟多的资源,例如银行办理业务,排队的人多了,可以多增加业务窗口;此方案为水平扩展的思想;

(5)提速:简单的就是提高资源性能,提高cpu性能或者单个服务器安装更多的cpu,此方案为垂直扩展

(6)消息中间件:模型可以理解为北京地铁站外面的排队走廊,具有缓冲人流量的功能;常见的消息队列有:RabbitMQ、ActiveMQ、RocketMQ(阿里)、kafka等

2、进程与线程

# 进程与线程的关系:

程序是源码编译后的文件,而这些文件被存放在磁盘上;当程序被操作系统加载到内存中,就是进程,进程中存放着指令和数据(资源),进程是线程的容器;线程是操作系统进行运算调度的最小单位;

2.1、线程的状态

2.2、python中的进程与线程

# 进程会启动一个解释器进程,线程共享一个解释器进程;会有一个GIL,全局解释器锁,来分配具体线程任务执行;python的GIL保证同一时刻只有一个线程被执行;

3、Python的多线程开发

3.1、Thread类

# Python的线程开发使用标准款threading;

# Thread类的初始化方法

def __init__(self, group=None, target=None, name=None,
         args=(), kwargs=None, *, daemon=None):

参数:
target  线程调用的对象,就是目标函数;
name   为线程起名
args   为目标函数传递位置参数,元祖;
kwargs  为目标函数传递关键字参数,字典

(1)线程的启动:

通过threading.Thread创建一个线程对象,target是目标函数,name指定线程名称,到此线程被创建完成,需要调用start() 方法来启动线程 ;

import threading
import time

def work():
    print('I m  working')
    print('Finished')


t=threading.Thread(target=work,name='workerthread')
t.start()

3.2、多线程

3.3、daemon线程与non-daemon线程

3.4、join方法

4、threading.local类

5、定时器Timer

猜你喜欢

转载自www.cnblogs.com/soulgou123/p/9877593.html