一,进程的含义
什么是进程呢?
进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
简单讲就是运行中的程序。
二,创建进程的方式
第一种:
是利用multiprocessing模块导入Process类来实现具体方法看代码
from multiprocessing import Process
import time
# 创建的子程序代码
def task(name):
print('%s is running' % name)
time.sleep(2)
print('%s is over' % name)
# 主程序
if __name__ == '__main__':
#创建一个进程target是目标执行函数 arges是元组参数
p1 = Process(target=task, args=('egon', ))
p1.start() # 告诉操作系统创建一个进程
print('主程序正在运行')
第二种
import time
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
# 必须写run方法
def run(self):
print('%s is running' % self.name)
time.sleep(1)
print('%s is end' % self.name)
if __name__ == '__main__':
#继承Process如果没有target目标方法,会自动调用带run方法
obj = MyProcess('egon')
obj.start()
#obj.join()方法是等待子进程执行结束后在执行主进程
print('主程序正在运行')
两种方法大致相同,只有略微不同
主进程正在运行
egon is running!
egon is end!
3 进程之间的数据通信
进程之间无法交互数据,因为进程与进程之间是相互隔离的,如果要实现数据的通信,可以间接的通过一些方法去实现:比如队列
队列相当于给进程间创造了一个公共管道,数据的通信通过这个管道进行。
from multiprocessing import Process,JoinableQueue
import time
import random
def producer(name, food, q):
for i in range(1,5):
data = '%s<%s>' % (food, i)
time.sleep(random.randint(1, 2))
q.put(data)
print('[%s]造好了[%s]' % (name, data))
def consumer(name, q):
while True:
data = q.get()
time.sleep(random.randint(1, 2))
# if data is None: break
print('[%s]吃了%s' % (name, data))
q.task_done()
if __name__ == '__main__':
q = JoinableQueue()
p1 = Process(target=producer, args=('大佬', '酸奶', q))
p2 = Process(target=producer, args=('DSB', '香蕉', q))
c2 = Process(target=consumer, args=('SSSS', q))
c1 = Process(target=consumer, args=('BBBB', q))
p1.start()
p2.start()
# 将c1、c2设置为守护进程,当主进程结束,守护进程会跟着结束
c1.daemon = True
c2.daemon = True
c1.start()
c2.start()
p1.join()
p2.join()
q.join()
print('主程序-到此一游')