进程以及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号
浙公网安备 33010602011771号