常用方法

p.start()p.join()

  • p.start():当前进程准备就绪,等待被CPU调度,简单理解也就是启动进程
  • p.join():等待当前进程的任务执行完毕后再向下继续执行

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import multiprocessing


def task(ele):
print(ele)
print("执行中")

if __name__ == "__main__":
multiprocessing.set_start_method("spawn")
ele = []

res = multiprocessing.Process(target=task,args=(ele,))
res.start()
res.join()
print("继续执行")

res.join()的出现会使得程序在执行完子进程之后再继续执行主进程,当然,上述案例已经让程序按顺序执行了,进程意义不大了。

p.daemon = bool,守护进程(必须放置在start之前)

  • p.daemon = True,设置为守护进程,主进程执行完毕后子进程也将被自动关闭。
  • p.daemon = Flase,设置为非守护进程,主进程等待子进程执行结束之后,主进程才会被关闭结束。

获取进程的信息

  • os.getpidos.getppid:获取进程与父进程的pid
  • len(threading.enumerate()):获取进程下线程个数
  • p.name = "第一个进程":设置进程名字
  • multiprocessing.current_process().name:获取当前进程的名字

自定义进程类

可以直接讲线程需要做的事情写run方法当中

1
2
3
4
5
6
7
8
9
10
11
12
import multiprocessing


class MyProcess(multiprocessing.Process):
def run(self):
print("开始执行")

if __name__ == "__main__":
multiprocessing.set_start_method("spawn")
p = MyProcess(args=("info",))
p.start()
print("继续执行")

CPU个数

1
multiprocessing.cpu_count()

数据共享

数据共享分为三种情况

  • 第一种情况是进程方式选择为fork模式,子进程拷贝了主进程的资源与数据,但是拷贝了已经是完全一个新的变量了,子进程改变并不能导致主进程改变,但是可以共享文件对象对象,实现多个进程同时写入一个文件当中。
  • 第二种情况是接入第三方数据共享平台,如多个进程操控同一个数据库或者同一个文件,通过修改第三方的数据进程数据共享。
  • 最后一种情况是创建一个数据共享对象实现数据共享,案例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import multiprocessing、


def task(key,value):
dic[key]=value

# 共享字典
if __name__ == '__main__':
m = multiprocessing.Manager()
dic = m.dict()
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,100))
p.start()
p.join()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import multiprocessing


def task(args):
q.put(args)

# 共享队列
if __name__ == '__main__':
q = multiprocessing.Queue()
for i in range(10):
p = multiprocessing.Process(target=task,args=(i,))
p.start()
p.join()
v1 = q.get()
print(v1)