#一、线程
#线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
#一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
#方法:
#start 线程准备就绪,等待CPU调度
#setName 设置线程名称
#getName 获取线程名称
#setDaemon 把一个主进程设置为Daemon线程后,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论有没执行完成,都会停止
#join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义
#run 线程被cpu调度后自动执行线程对象的run方法
#三. 线程的属性
#(1)轻型实体
#(2)独立调度和分派的基本单位
#(3)可并发执行
#(4)共享进程资源
#线程的threading模块
#线程第一种调用方式:直接调用
import threading
import time
‘’‘直接调用’’’
def hello(name):
print(“Hello %s”%name)
time.sleep(3)
if name == “main”:
t1=threading.Thread(target=hello,args=(“zhangsan”,)) #生成线程实例
t2=threading.Thread(target=hello,args=(“lisi”,))
t1.setName("aaa") #设置线程名
t1.start() #启动线程
t2.start()
t2.join() #join 等待t2先执行完
print("Hello")
print(t1.getName()) #获取线程名
#第二种:继承调用
‘’‘继承式调用’’’
import threading
import time
class MyThread(threading.Thread):
def init(self,name):
threading.Thread.init(self)
self.name = name
def run(self):
print(“Hello %s”%self.name)
time.sleep(3)
if name == “main”:
t1=MyThread(“zhangsan”)
t2=MyThread(“lisi”)
t1.start()
t2.start()
#==========================================================================================
#进程定义:
#进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序
#用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外
#部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
#进程的multiprocessing模块
#进程调用
from multiprocessing import Process
import time
def start(name):
time.sleep(1)
print(‘hello’, name)
if name == ‘main’:
p = Process(target=start, args=(‘zhangsan’,))
p1 = Process(target=start, args=(‘lisi’,))
p.start()
p1.start()
p.join()
#==============================================================================================
#三 协程
#协程,又称微线程,是一种用户态的轻量级线程。协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态,
#换种说法:进入上一次离开时所处逻辑流的位置,当程序中存在大量不需要CPU的操作时(IO),适用于协程。
#协程有极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。
#不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
#因为协程是一个线程执行,所以想要利用多核CPU,最简单的方法是多进程+协程,这样既充分利用多核,又充分发挥协程的高效率。
#那符合什么条件就能称之为协程:1、必须在只有一个单线程里实现并发 2、修改共享数据不需加锁 3、用户程序里自己保存多个控制流的上下文栈
#4、一个协程遇到IO操作自动切换到其它协程
#协程有两个模块,gevent和greenlet。
#gevent(自动切换,由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成)
from gevent import monkey; monkey.patch_all()
import gevent
import time
def foo():
print(‘11’)
time.sleep(3)
print(‘22’)
def bar():
print(‘33’)
print(‘44’)
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
#greenlet的执行顺序需要我们手动控制
from greenlet import greenlet
def test1():
print (11)
gr2.switch() #手动切换
print (22)
gr2.switch()
def test2():
print (33)
gr1.switch()
print (44)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
#操作系统概念
#操作系统位于底层硬件与应用软件之间的一层。工作方式:向下管理硬件,向上提供接口。
#操作系统进行进程切换:1.出现IO操作;2.固定时间。
#固定时间很短,人感受不到。每一个应用层运行起来的程序都是进程。
#程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。需要强调的是:同一个程序执行两次,那也是两个进程。
#进程:资源管理单位(容器)。
#线程:最小执行单位,管理线程的是进程
#在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程。
#多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,控制该进程的地址空间。
#进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。
#进程和线程的关系:
#(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
#(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
#(3)CPU分给线程,即真正在CPU上运行的是线程。