网络编程之-----------进程

进程的概念

当我们双击的时候,操作系统将程序装载到内存中,操作系统为它分配资源,然后才能运 行。运行起来的应用程序就称之为进程。也就是说当程序不运行的时候我们称之为程序,当 程序运行起来他就是一个进程。通俗的理解就是不运行的时候是程序,运行起来就是进程。 程序和进程的对应关系是:程序只有一个,但是进程可以有多个。

进程的特征

  • 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
  • 并发性:任何进程都可以同其他进程一起并发执行
  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
  • 结构特征:进程由程序、数据和进程控制块三部分组成。
  • 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

程序与进程的区别

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程是程序正在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定的生命期的。
程序是永久的,进程是暂时的。
进程的状态
在这里插入图片描述

在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行 和 阻塞。

  1. 就绪(Ready)状态
    当进程已分配到除CPU以为的所有必要的资源,只要获得处理机便可立即执行,这时进程状态称为就绪状态。
  2. 执行/运行(Running)状态
    当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
  3. 阻塞(Blocked)状态
    正在执行的进程,由于等待某个时间发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的时间有多种,例如:等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

multiprocess模块

Python中提供了multiprocess。仔细来说multiprocess不是一个模块而是python中一个操作、管理进程的包。之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。大致分为四个部分:创建进程部分、进程同步部分、进程池部分、进程之间数据共享。

Process模块介绍

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)

强调:

  1. 需要使用关键字的方式来指定参数
  2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号

参数介绍:

  1. group参数未使用,值始终为None
  2. target表示调用对象,即子进程要执行的任务
  3. args表示调用对象的位置参数元组,args=(1,2,‘egon’,)
  4. kwargs表示调用对象的字典,kwargs={‘name’:‘egon’,‘age’:18}
  5. name为子进程的名称

在Windows中使用Process模块的注意事项

在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程的部分使用if name ==‘main’ 判断保护起来,import 的时候 ,就不会递归运行了。

使用Process模块创建进程

创建并开启子进程的两种方式
(方法一):

import os
from multiprocessing import Process

def func(name):
    print("hello",name)
    print("我是子进程:%d 我的父进程id是:%d" %(os.getpid(),os.getppid()))
    
if __name__ == '__main__':
    p=Process(target=func,args=('xiaobai',))
    p.start()
    print("我是父进程:%d" % os.getpid())

运行截图:
在这里插入图片描述
(方法二):

# 通过继承Process类的形式开启进程的方式
import os
from multiprocessing import Process

class info(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
        
    def run(self):
        print(os.getpid())
        print(" %s 正在和父母打电话" % self.name)
        
if __name__ == '__main__':
    p1=info('cc')
    p2=info('kk')
    
    p1.start()# start会自动调用run方法
    p2.start()
    
# 说明:如果需要传参,必须写入到__init__方法里面,且必须加上super().__init__();因为父类Process里面也有__init__方法。

运行截图:
在这里插入图片描述

Process对象的join方法

import time
from multiprocessing import Process

def fun(name):
    print('hello',name)
    time.sleep(1)
    print('我是子进程')
    
if __name__ == '__main__':
    p=Process(target=fun,args=('cc',))
    p.start()
    p.join() # 加上join方法后,父进程就会阻塞等待子进程结束而结束。
    print("我是父进程")

运行截图:
在这里插入图片描述

Process开启多进程

多个进程同时运行(注意:子进程的执行顺序不是根据自动顺序决定的)

import time
from multiprocessing import Process

def func(name):
    print("hello 进程 %d" % name)
    time.sleep(1)
    
if __name__ == '__main__':
    for i in range(1,10):

        p=Process(target=func,args=(i,))
        p.start()

运行截图:
在这里插入图片描述

多个进程同时运行,用join方法①

import time
from multiprocessing import Process

def func(name):
    print("hello 进程 %d" % name )
    time.sleep(0.1)

if __name__ == '__main__':
    p_lst = []
    for i in range(10):
        p = Process(target=func, args=(i,))
        p.start()
        p_lst.append(p)
    print("父进程执行中")

运行截图:
在这里插入图片描述

多个进程同时运行,用join方法②

import time
from multiprocessing import Process

def func(name):
    print("hello 进程 %d" % name )
    time.sleep(0.1)

if __name__ == '__main__':
    p_lst = []
    for i in range(10):
        p = Process(target=func, args=(i,))
        p.start()
        p_lst.append(p)
        
        p.join()
        
    print("父进程执行中")

运行截图:
在这里插入图片描述

发布了49 篇原创文章 · 获赞 5 · 访问量 2017

猜你喜欢

转载自blog.csdn.net/qq_44619595/article/details/103886050