python线程进程与协程 - 随笔分类 - Eva_J - 博客园
1多任务原理
不需要实现复杂的内存共享且需利用多cpu,用多进程;
实现复杂的内存共享及IO密集型应用:多线程或协程;
实现复杂的内存共享及CPU密集型应用:协程
单核cpu实现多任务原理:操作系统轮流让各个任务交替执行
多核CPU实现多任务原理:真正并行执行多任务只能在多核CPU
并发:看上去是一起执行,任务数多于CPU核心数
并行:真正一起执行,任务数小于CPU核心数
实现多任务的方式:
1、多进程模式
2、多线程模式
3、协程模式
4、多进程+多线程模式
2 进程
对于操作系统而言:一个任务就是一个进程
进程是系统中程序执行和资源分配的基本单位。
每个进程都有自己的数据段、代码段、堆栈段
1)、单任务现象
from time import sleep
def run():
while True:
print("sunck is a good man")
sleep(1.2)
if __name__ =="__main__":
while True:
print("sunck is a good man")
sleep(1)
#不会执行到run方法
run()
2)启动多进程实现多任务
multiprocessing 库,跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象
3)父子进程的先后顺序
4)全局变量在多个进程中不能共享
5)启动大量子进程
6)多进程实现文件拷贝
7)封装进程对象
8)进程间的通信 (使用队列进行通信)
3.线程
在一个进程的内部,有多个需要同时进行的‘子任务’,我们把这些‘子任务’叫做线程。
线程通常叫做轻型的进程。线程是共享内存空间的,并发执行的多任务,每一个线程都共享一个进程的资源。
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定。
模块
1、_thread模块 低价模块
2、threading模块 高级模块,对_thread模块进行封装
1)启动一个线程
2)线程间共享数据
多进程和多线程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在在每个进程中,互不影响。 而多线程中,所有变量都由线程共享。所以任何一个变量都可以被任意一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时修改一个变量,容易把内容改乱。
python为了线程安全,就设置了全局解释器锁机制,既一个进程中同时只能有一个线程访问cpu。
3)使用线程锁解决数据混乱
4)ThreadLocal
创建一个全局的ThreadLocal对象,让每个线程有独立的存储空间,每个线程对ThreadLocal对象可以读写且互不影响。
作用:为每一个线程绑定一个数据库链接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便的访问这些资源。
5)客户端与服务端的交互
TCP 是建立可靠的连接,并且通过双方都可以以流的形式发送数据。相对于TCP,UDP则是面向无连接的协议。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发送数据包。但是能不能到达就不知道。
虽然UDP传输数据不可靠,但他的优点是和TCP比,速度快,对于要求不高的数据可以用UDP。
6)信号量控制线程数量
7)凑够一定数量才一起执行
8)定时线程
8)线程间的通信
9)生产者消费者模型
10)线程调度问题