灵虚御风
醉饮千觞不知愁,忘川来生空余恨!

导航

 

关于进程(传参,多进程任务,全局变量,进程池)

lion.Kk 2018-08-17 19:57:03 1145 收藏 2
版权
1.关于进程里的传参

import multiprocessing#导入进程模块
def card():
  print("word:%s,name:%s,age:%d"%word,name,age)
if __name__=="__main__":
  process=multiprocessing.Process(target=card,args=("你好",),kwargs={"name":wu,"age"=18})#arges要是一个元祖形式
  process.daemon=True
  #守护进程:如果没有daemon的话,一般的主进程结束的时候子进程是不会结束的它还会继续执行,所以我们需要在主进程结束的时候让子进程也立即停止。
  #这个属性为一个布尔值,表示是否为一个守护进程,且这个属性设置必须在线程的start方法开始之前调用。它的值继承自主线程,主线程的daemon为False且所有从主线程创建的线程都是daemon = False。
  process.start()
  process.close()
1
2
3
4
5
6
7
8
9
10


2.关于多进程任务

import multiprocessing
import os
def text():
  for i in range(5):
  print("text",i)
  print("当前进程",multiprocessing.current_process().pid)
  print("父进程编号",os.getppid)
if __name__=="__main__":
  process=multiprocessing.Process(target=text)
  process.start()
  print("当前运行进程",os.getpid)
1
2
3
4
5
6
7
8
9
10
11
执行以上进程可以清楚的观察到各进程运行的顺序。

3.关于进程里的全局变量

import multiprocessing
import time
list1=[] #list1是一个全局变量
def write():
  for i in range(5):
  list1.append(i)
  time.sleep(1)
def read():
  print(list1)
if __name__=="__main__":
  t1=multiprocessing.Process(target=write)
  t2=multiprocessing.Process(target=read)
  t1.start()
  t1.join #让t1运行完在运行t2
  t2.start()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
执行上述进程可以看到t1列表中有值,而t2列表还是一个空值列表,所以由此可见在不同的进程中它们是不共享全局变量的,只有在线程中才共享全局变量。

4.关于进程池
进程池的一般写法:

import multiprocessing
import os
import time

def copy(index):
  print('当前进程的编号',os.getpid())
  print(index)
  time.sleep(1)


if __name__ == '__main__':
  pool = multiprocessing.Pool(5)
  #进程池里有5个进程
  for i in range(10):
  pool.apply_async(copy,(i,))#往进程池传递一个实例方法
  pool.close()
  pool.join()
  # join的作用:主进程阻塞,等待子进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的进程池,以空间换时间,来提高运行效率。一个池子里能同时运行的任务是取决你电脑的cpu数量,如我的电脑现在是有4个cpu,那会子进task0,task1,task2,task3可以同时启动,task4则在之前的一个某个进程结束后才开始

posted on 2021-12-08 12:17  没有如果,只看将来  阅读(79)  评论(0编辑  收藏  举报