python-多线程的同步方式

python 中多线程实现是表象,本质任然是切分时间片;
从操作系统上来看,python中多线程,本质上是利用cpu空间时间实现,但并非是真正意义上的并行执行

线程是指进程内的一个执行单元,也是进程内的可调度实体.

与进程的区别:
(1) 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3) 线程是处理器调度的基本单位,但进程不是.
(4) 二者均可并发执行.

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程间同步

多个线程,共同对某个数据修改,可能出现不可预料的结果,为保证数据的正确性,需要实现线程的同步。
线程同步的几种方式:

使用Thread对象的Lock和RLock,实现简单线程同步,这两个对象都有acquire和release方法,对于
每次只允许一个线程操作的数据,可以将获取锁的方法,保证线程的同步;
Note: Python 有一个GIL(Global Interpreter Lock)机制, 任何线程运行之前必须获取这个
全局锁, 每当执行完100条字节码,全局锁才会释放,切换到其他线程。
1、锁机制
2、线程同步队列queue

线程池

传统多线程问题?
传统多线程,使用“及时创建, 即时销毁”的策略。虽然创建线程时间大大缩短,但是提交给线程的任务执行
时间较短,而且执行次数及其频繁,那么服务器将处于不停创建线程,销毁线程状态。

一个线程运行时间分为三部分:启动,执行,销毁。
多线程场景中,如果线程不能被重用,每次线程都经过,启动,执行,销毁3个过程,会增加系统相应时间,降低
效率。
线程池原理:

将任务放进队列之中, 然后开N个线程, 每个线程都去队列中取一个任务,执行完之后告诉系统,接着去队列中取
下一个任务,直到队列为空,退出线程。

线程池设置多少?
线程执行,计算时间分为两部分:
1、 cpu计算,占用cpu
2、不需要cpu计算,不占用cpu,等待IO返回,eg:recv(), sleep()等
N核服务器,执行业务单线层分析出本地计算时间x, 等待时间y
工作线程数:N*(x+y)/x,能让cpu利用率最大化。

参考连接: https://blog.csdn.net/daiyu__zz/article/details/81912018

posted @ 2021-12-21 20:03  酷酷的排球  阅读(930)  评论(0编辑  收藏  举报