进程以及process创建进程
实现多任务的另一种方式
什么是进程,什么是程序?
程序: 例如xxx.py这是程序,是一个静态的
进程: 通俗来说一个程序或者软件运行起来就是叫做一个进程, 你可以想成一个公司,公司需要准备相应工作需要的资源,对应我们进程来说,同样需要准备相应资源让代码能够执行, 每个进程启动都需要向操作系统申请资源,所以进程是操作系统资源分配的一个基本单位
默认情况下,一个进程至少会有一个线程, 没有进程就没有线程, 因为线程是依附在进程里面的
进程的创建-multiprocessing
multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。不仅可以通过线程完成多任务,进程也是可以的
# 之前线程可以完成多任务, 现在这个进程也可以完成多任务, 原因是进程里面默认一个条主线程在工作
import multiprocessing
import time
import os
# 任务1
def work1():
for i in range(10):
print("work1:------", i)
print("work1的当前进程:", multiprocessing.current_process())
# 获取当前进程id
print("work1获取当前进程的进程id:", multiprocessing.current_process().pid, os.getpid())
# 获取当前进程的父进程的id
print("work1获取父进程的id", os.getppid())
time.sleep(0.1)
if __name__ == '__main__':
print("当前进程:", multiprocessing.current_process())
print("获取当前进程的进程id:", multiprocessing.current_process().pid, os.getpid())
# 创建进程
sub_process = multiprocessing.Process(target=work1)
# 启动进程
sub_process.start()
# 主进程的操作
while True:
print("我在主进程中执行。。。")
time.sleep(0.1)
Process语法结构如下:
target : 如果传递了函数的引用,可以任务这个子进程就执行这里的代码
args : 给target指定的函数传递参数,以元祖的方式传递
kwargs:给target指定的函数传递命名参数
name:给进程设定一个名字,也可以不设定
group:指定进程组,大多数情况下用不到
Process创建的实里对象的常用方法:
start():启动子进程实例(创建子进程)
is_alive( ): 判断进程子进程是否还在活着
join(【timeout】):是否等待子进程执行结束,或等待多少秒
terminate( ):不管任务是否完成,立刻终止子进程
进程之间不共享全局变量
代码实例如下
# 进程之间不共享全局变量
import multiprocessing
import time
# 全局变量
mylist = list()
# 写入数据的任务
def write_data():
for i in range(10):
mylist.append(i)
time.sleep(0.1)
print("写入后的数据:", mylist)
# 读取数据的任务
def read_data():
while True:
print("读取全局变量的数据为:", mylist)
time.sleep(0.5)
if __name__ == '__main__':
# 创建2个进程
write_process = multiprocessing.Process(target=write_data)
read_process = multiprocessing.Process(target=read_data)
# 开启进程
write_process.start()
# 等待写入进程执行完成以后再去读取数据
write_process.join()
read_process.start()
# 进程之间不共享全局变量
运行结果如下:
写入后的数据: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
读取全局变量的数据为: []
读取全局变量的数据为: []
读取全局变量的数据为: []
读取全局变量的数据为: []
读取全局变量的数据为:
......
因为进程是操作系统分配的基本单位,每创建一个进程都会向操作系统申请资源,操作系统会开辟一个新的内存空间供它使用。。就好比两个不同的房间,我给我房间买了一些家具,不关我邻居的事
进程和线程对比
1:进程是操作系统资源分配的基本单位, 进程只提供运行所需要资源, 操作给进程分配资源
2 :线程是进程中的执行实例,可以理解一个执行的分支,默认情况下一个进程只有一个线程,也就是有一个分支, 线程是cpu调度的基本单位
3 :线程之间可以共享全局变量, 进程直接不能共享,能是独立的两个进程,只是变量名相同而已。
4 :同一个进程中,如果进程中某一个线程挂了,那么进程直接退出死掉了, 如果在不同进程情况下,某一个进程死了, 不会影响其它进程的执行。
5 :进程开发程序的健壮型强, 多线程开发,某一个线程挂断那么进程就退出了,健壮型没有进程强
6 :进程需要额外分配新的运行资源,但是线程之间共享进程资源
菜鸟的自我修养
浙公网安备 33010602011771号