听了林海深老师的课程后对python多进程的理念又有了更多的了解,下面来与大家分享
一 、什么是进程?
进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。
二、谈谈进程与程序的区别:
程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。
需要强调的是:同一个程序执行两次,那也是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放海贼王,一个可以播放妖精的尾巴。
三、了解并发与并行的概念:
ps:无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务
1、并发:
是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)
2、并行:
同时运行,只有具备多个cpu才能实现并行
四、了解同步,异步,阻塞与非阻塞
同步与异步描述的是任务的提交方式
同步:任务提交之后,原地等待任务的返回结果,等待的过程中不做任何事(干等)。程序层面上表现出来的感觉就是卡住了
异步:任务提交之后,不原地等待任务的返回结果,直接去做其它事情
阻塞与非阻塞描述的是程序的运行状态
阻塞:阻塞态(
阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
)
非阻塞:就绪态、运行态
(
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。
)
上述概念的组合最高效的是异步非阻塞
五、看完上述概念后接下来为大家介绍创建进程的两种方式:
1、第一种方式
from multiprocessing import Process
import time
def task(name):
print('======进程2======')
print('%s is running' % name)
time.sleep(2)
print('%s is over' % name)
if __name__ == '__main__':
# 1、创建一个对象
p = Process(target=task, args=('egon',))
# 2、开启进程
p.start()# =>告诉操作系统帮你创建一个进程
print('======进程1======')
print('hahahhaha')
# 运行代码后相当于有两个进程在执行
'''
windows操作系统下创建进程一定要在main内创建
因为windows下创建进程类似于模块导入的方式
会从上往下一次执行代码
Linux中则是直接将代码完整的拷贝一份
'''
2、第二种方式? 类的继承
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print('======进程2======')
print('hello girl')
time.sleep(2)
print('get out!')
if __name__ == '__main__':
p=MyProcess()
p.start()
print('======进程1======')
print('hahahhaha')
'''
总结:
创建进程就是在内存中申请一块内存空间将需要运行的代码丢进去
一个进程对应在内存中就是一块独立的内存空间
多个进程对应在内存中就是多块独立的内存空间
进程与进程之间数据默认情况下是无法直接进行交互的,如果想交互可以借助第三方工具 模块
'''
六、jion 方法:
'''
jion 方法:
jion方法是让主进程等待子进程代码运行结束后,再继续运行。不影响其他子进程的执行
'''
from multiprocessing import Process
import time
def task(name):
print('======进程2======')
print('%s is running' % name)
time.sleep(2)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('egon',))
p1.start()
p1.join() # 主进程等待子进程p运行结束后再继续往后执行
print('======进程1======')
print('hahahhaha')
'''
运行结果:
======进程2======
egon is running
egon is over
======进程1======
hahahhaha
'''
from multiprocessing import Process
import time
def task(name):
print('======进程2======')
print('%s is running' % name)
time.sleep(2)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('egon',))
p2 = Process(target=task, args=('json',))
p1.start()
p2.start()
# p.join() # 主进程等待子进程p运行结束后再继续往后执行
print('======进程1======')
print('hahahhaha')
'''
运行结果:
======进程2======
egon is running
egon is over
======进程1======
hahahhaha
'''
from multiprocessing import Process
import time
def task(name):
print('======进程2======')
print('%s is running' % name)
time.sleep(2)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('egon',))
p2 = Process(target=task, args=('json',))
p1.start()
p2.start()
# p.join() # 主进程等待子进程p运行结束后再继续往后执行
print('======进程1======')
print('hahahhaha')
'''
运行结果:
======进程1======
hahahhaha
======进程2======
egon is running
======进程2======
json is running
egon is over
json is over
不是按顺序执行的,仅仅是告诉操作系统要创建进程
'''
from multiprocessing import Process
import time
def task(name,n):
print('======进程2======')
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('egon',1))
p2 = Process(target=task, args=('json',2))
start_time=time.time()
p1.start()
p2.start()
p1.join()
p2.join()
print('======进程1======')
print('hahahhaha')
print(time.time()-start_time)# 相当于多核CPU同时工作,时间为进程最长的时间
'''
运行结果:
======进程2======
egon is running
======进程2======
json is running
egon is over
json is over
======进程1======
hahahhaha
2.409942865371704 ==》相当于p2 = Process(target=task, args=('json',2))中的time.sleep(2)=》2s
'''
# 精简版
from multiprocessing import Process
import time
def task(name,n):
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
start_time=time.time()
p_list=[]
for i in range(1,4):
p=Process(target=task,args=('子进程%s'%i,i))
p.start()
p_list.append(p)
for p in p_list:
p.join()
print('======主进程======')
print('hahahhaha')
print(time.time()-start_time)
'''
运行结果:
子进程1 is running
子进程2 is running
子进程3 is running
子进程1 is over
子进程2 is over
子进程3 is over
======主进程======
hahahhaha
3.489610195159912
'''
|