python代码运行出来是process_python 进程 部分 process模块

理解就好了

进程 是资源分配的单位

进程的调度:就是多个进程(运行中的程序)在操作系统的控制下被cpu执行,去享用计算机的资源

先来先服务

短作业服务

时间片服务

多级反馈队列

进程调度的过程是不能够随意被程序影响的

程序的并行和并发

并行更快

并发只是宏观上的同时执行

进程一共有三个状态:

就绪 运行 阻塞

同步

异步

阻塞

非阻塞

进程:

pid   Process ID 进程ID

ppid parent process id 父进程ID

父进程 负责回收一些子进程的资源

子进程

上代码:

os 补充:

# import os

# import time

# print(os.getpid())子进程

# print(os.getppid())父进程

# time.sleep(100)

Process 进程模块

import os

import time

from multiprocessing import Process # 进程模块

#

# def func():

# time.sleep(2)

# print('in func',os.getpid(),os.getppid())

#

#

# if __name__ == '__main__':

# print('in main',os.getpid(),os.getppid())

# p1 = Process(target=func) # 进程对象

# p1.start() # 向操作系统提交了一个开启子进程的申请

# p2 = Process(target=func) # 进程对象

# p2.start() # 向操作系统提交了一个开启子进程的申请

# print('主进程 的 代码执行结束了')

# 原理

# if __name__ == '__main__':

# 使用python都是调用操作系统的命令来启动进程

# 同样使用python 不同的操作系统的操作是不同的

# 对于windows来说 必要加if __name__ == '__main__':

# 对于linux ios来说 不必要加if __name__ == '__main__':

给子进程传参数

# def func(num):

# time.sleep(2)

# print('in func',num,os.getpid(),os.getppid())

#

#

# if __name__ == '__main__':

# print('in main',os.getpid(),os.getppid())

# p1 = Process(target=func,args=(1,)) # 进程对象,注意必须是元组,

# p1.start() # 向操作系统提交了一个开启子进程的申请

# p2 = Process(target=func,args=(2,)) # 进程对象

# p2.start() # 向操作系统提交了一个开启子进程的申请

# print('主进程 的 代码执行结束了')

开启多个子进程

def func(num):

# print('in func',num,os.getpid(),os.getppid())

#

# if __name__ == '__main__':

# print('in main',os.getpid(),os.getppid())

# for i in range(10):

# p = Process(target=func,args=(i,))

# p.start() # start不是运行一个程序,而是调用操作系统的命令,要创建子进程

# print('主进程 的 代码执行结束了')

join()方法,子进程执行完毕后才执行join下的代码

def func(num):

# time.sleep(1)

# print('in func',num,os.getpid(),os.getppid())

#

# if __name__ == '__main__':

# print('in main',os.getpid(),os.getppid())

# p = Process(target=func,args=(1,))

# p.start() # start不是运行一个程序,而是调用操作系统的命令,要创建子进程

# p.join() # 阻塞,直到p这个子进程执行完毕之后再继续执行

# print('主进程 的 代码执行结束了')

一批任务使用join

def func(num):

print('in func',num,os.getpid(),os.getppid())

if __name__ == '__main__':

print('in main',os.getpid(),os.getppid())

p_l = []

for i in range(10):

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

p.start() # start不是运行一个程序,而是调用操作系统的命令,要创建子进程,非阻塞

p_l.append(p)

print(p_l)

for p in p_l :

p.join() # 阻塞,直到p这个子进程执行完毕之后再继续执行

print('主进程 的 代码执行结束了')

is_alive查看进程的状态 terminate强制结束子进程执行

def func(num):

# time.sleep(2)

# print('in func',num,os.getpid(),os.getppid())

#

#

# if __name__ == '__main__':

# print('in main',os.getpid(),os.getppid())

# p1 = Process(target=func,args=(1,)) # 进程对象

# p1.start() # 向操作系统提交了一个开启子进程的申请

# print(p1.is_alive()) # 检测进程是否在执行任务

# p1.terminate() # 强制结束子进程 - 非阻塞

# print(p1.is_alive()) # 检测进程是否在执行任务

# print('主进程 的 代码执行结束了')

面向对象使用开启子进程

class MyProcess(Process):#名字可以自己定义,但是必须要继承Process

# def __init__(self,num):#这是传入参数

# super().__init__()#引用将父类的

# self.num = num #封装属性

# def run(self):#这是为执行start而准备的函数

# print('in run ',self.num,os.getpid(),os.getppid())#代码

#

# if __name__ == '__main__':#防止子进程陷入循环创建

# print('in main ', os.getpid(), os.getppid())#代码

# p = MyProcess(1)#实例化

# p.start()#执行start

摘录博客

multiprocess模块

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

multiprocess.process模块

process模块介绍

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

process模块介绍

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

copycode.gif

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为子进程的名称

copycode.gif

ExpandedBlockStart.gif

p.start():启动进程,并调用该子进程中的p.run()

p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法

p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁

p.is_alive():如果p仍然运行,返回True

p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

方法介绍

copycode.gif

1 p.start():启动进程,并调用该子进程中的p.run()

2 p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法

3 p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁

4 p.is_alive():如果p仍然运行,返回True

5 p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

copycode.gif

ExpandedBlockStart.gif

p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置

p.name:进程的名称

p.pid:进程的pid

p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)

p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

属性介绍

copycode.gif

1 p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置

2 p.name:进程的名称

3 p.pid:进程的pid

4 p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)

5 p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

copycode.gif

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

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

使用process模块创建进程

在一个python进程中开启子进程,start方法和并发效果。

import time

from multiprocessing import Process

def f(name):

print('hello', name)

print('我是子进程')

if __name__ == '__main__':

p = Process(target=f, args=('bob',))

p.start()

time.sleep(1)

print('执行主进程的内容了')

在python中启动的第一个子进程

import time

from multiprocessing import Process

def f(name):

print('hello', name)

time.sleep(1)

print('我是子进程')

if __name__ == '__main__':

p = Process(target=f, args=('bob',))

p.start()

#p.join()

print('我是父进程')

join方法

import time

from multiprocessing import Process

def f(name):

print('hello', name)

time.sleep(1)

print('我是子进程')

if __name__ == '__main__':

p = Process(target=f, args=('bob',))

p.start()

#p.join()

print('我是父进程')

join方法

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

import time

from multiprocessing import Process

def f(name):

print('hello', name)

time.sleep(1)

if __name__ == '__main__':

p_lst = []

for i in range(5):

p = Process(target=f, args=('bob',))

p.start()

p_lst.append(p)

多个进程同时运行

import time

from multiprocessing import Process

def f(name):

print('hello', name)

time.sleep(1)

if __name__ == '__main__':

p_lst = []

for i in range(5):

p = Process(target=f, args=('bob',))

p.start()

p_lst.append(p)

多个进程同时运行

import time

from multiprocessing import Process

def f(name):

print('hello', name)

time.sleep(1)

if __name__ == '__main__':

p_lst = []

for i in range(5):

p = Process(target=f, args=('bob',))

p.start()

p_lst.append(p)

多个进程同时运行

除了上面这些开启进程的方法,还有一种以继承Process类的形式开启进程的方式

import os

from multiprocessing import Process

class MyProcess(Process):

def __init__(self,name):

super().__init__()

self.name=name

def run(self):

print(os.getpid())

print('%s 正在和女主播聊天' %self.name)

p1=MyProcess('wupeiqi')

p2=MyProcess('yuanhao')

p3=MyProcess('nezha')

p1.start() #start会自动调用run

p2.start()

# p2.run()

p3.start()

p1.join()

p2.join()

p3.join()

print('主线程')

通过继承Process类开启进程

import os

from multiprocessing import Process

class MyProcess(Process):

def __init__(self,name):

super().__init__()

self.name=name

def run(self):

print(os.getpid())

print('%s 正在和女主播聊天' %self.name)

p1=MyProcess('wupeiqi')

p2=MyProcess('yuanhao')

p3=MyProcess('nezha')

p1.start() #start会自动调用run

p2.start()

# p2.run()

p3.start()

p1.join()

p2.join()

p3.join()

print('主线程')

通过继承Process类开启进程

多进程中的其他方法

ExpandedBlockStart.gif

from multiprocessing import Process

import time

import random

class Myprocess(Process):

def __init__(self,person):

self.name=person

super().__init__()

def run(self):

print('%s正在和网红脸聊天' %self.name)

time.sleep(random.randrange(1,5))

print('%s还在和网红脸聊天' %self.name)

p1=Myprocess('哪吒')

p1.start()

p1.terminate()#关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活

print(p1.is_alive()) #结果为True

print('开始')

print(p1.is_alive()) #结果为False

进程对象的其他方法:terminate,is_alive

copycode.gif

from multiprocessing import Process

import time

import random

class Myprocess(Process):

def __init__(self,person):

self.name=person

super().__init__()

def run(self):

print('%s正在和网红脸聊天' %self.name)

time.sleep(random.randrange(1,5))

print('%s还在和网红脸聊天' %self.name)

p1=Myprocess('哪吒')

p1.start()

p1.terminate()#关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活

print(p1.is_alive()) #结果为True

print('开始')

print(p1.is_alive()) #结果为False

copycode.gif

ExpandedBlockStart.gif

class Myprocess(Process):

def __init__(self,person):

self.name=person # name属性是Process中的属性,标示进程的名字

super().__init__() # 执行父类的初始化方法会覆盖name属性

#self.name = person # 在这里设置就可以修改进程名字了

#self.person = person #如果不想覆盖进程名,就修改属性名称就可以了

def run(self):

print('%s正在和网红脸聊天' %self.name)

# print('%s正在和网红脸聊天' %self.person)

time.sleep(random.randrange(1,5))

print('%s正在和网红脸聊天' %self.name)

# print('%s正在和网红脸聊天' %self.person)

p1=Myprocess('哪吒')

p1.start()

print(p1.pid) #可以查看子进程的进程id

进程对象的其他属性:pid和name

copycode.gif

1 class Myprocess(Process):

2 def __init__(self,person):

3 self.name=person # name属性是Process中的属性,标示进程的名字

4 super().__init__() # 执行父类的初始化方法会覆盖name属性

5 #self.name = person # 在这里设置就可以修改进程名字了

6 #self.person = person #如果不想覆盖进程名,就修改属性名称就可以了

7 def run(self):

8 print('%s正在和网红脸聊天' %self.name)

9 # print('%s正在和网红脸聊天' %self.person)

10 time.sleep(random.randrange(1,5))

11 print('%s正在和网红脸聊天' %self.name)

12 # print('%s正在和网红脸聊天' %self.person)

13

14

15 p1=Myprocess('哪吒')

16 p1.start()

17 print(p1.pid) #可以查看子进程的进程id

copycode.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值