标签:self 多核 计算机 reading 随机 ESS 多线程 抽象 遇到
1.空间上的复用
多个程序共用一套计算机硬件
2.时间上的复用
切换+保存状态
1).当一个程序遇到IO操作 操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)
2).当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)
time.sleep()本质和时间复用一样 睡觉时候操作系统会切换cpu。
3.串行、并发与并行
串行:程序运行完才能进入下一个程序
并发:看起来多个任务同时执行即可。单核也可以实现并发
并行:真正意义上的同时运行,只有多核才能实现。
4.同步异步
同步异步:表示的是任务的提交方式
同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事(程序层面的表现就是卡住了)
异步:任务提交之后 不再原地等待 而是继续执行下一行代码(结果是要的 但是是用过其他方式获取)
5.阻塞非阻塞
阻塞非阻塞:表示的程序的运行状态
阻塞:阻塞态
非阻塞:就绪态 运行态
1.什么是进程?
进程指的就是一个正在运行的程序,或者说是程序的运行过程,即进程是一个抽象的概念
为何要进程? 实现并发。
创建进程就是在内存中重新开辟一块内存空间,将允许产生的代码丢进去。一个进程所对应的内存就是一块独立的内存空间。
进程与进程之间数据是隔离的,无法直接交互。但是可以通过某些技术实现间接交互。
同一个程序执行两次,也算是开启了两个进程。
2.创建进程的两种方式
os.cpu_count() 查看电脑是几个处理器。
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。
创建进程的第一种方式
from multiprocessing import Process import time def test(name): print(‘%s is running‘%name) time.sleep(2) print(‘%s is over‘%name) if __name__ == ‘__main__‘: p = Process(target=test,args=(‘li‘,))# 创建一个进程对象。当容器类型(此处是元组)中只有一个参数时,最好把逗号加上。
# 第一个传函数的名字过来,第二个传函数要用到的参数。
p.start()# 告诉操作系统帮你创建一个进程 异步 print(‘主‘) #注意:windows创建进程会将代码以模块的方式,从上往下执行一遍 # linux会直接将代码完完整整的拷贝一份 # windows创建进程一定要在if __name__ == ‘__main__‘:代码块内创建 ,否则会报错
创建进程的第二种方式 from multiprocessing import Process import time class MyProcess(Process): def __init__(self,name): super().__init__() self.name = name def run(self): print(‘%s is running‘ % self.name) time.sleep(3) print(‘%s is over‘ % self.name) if __name__ == ‘__main__‘: p = MyProcess(‘egon‘) p.start() #仅仅是告诉操作系统帮你创建一个进程,至于这个进程什么时候创,完全由操作系统随机决定。 print(‘主‘)
3.join方法
利用p.start()创建多个进程,无法准确获取到进程创建的先后顺序。仅仅是告诉操作系统帮你创建一个进程,至于这个进程什么时候创,完全由操作系统随机决定。
p.join(),表示主进程代码需要等子进程运行完才会开始运行。
os.getpid()可以获取子进程的id。%os.getppid()可以获取父进程的id。
p.daemon = True # 将该进程设置为守护进程 这一句话必须放在start语句之前,否则报错。
标签:self 多核 计算机 reading 随机 ESS 多线程 抽象 遇到
原文地址:https://www.cnblogs.com/blue-tea/p/11337024.html