知识点一:进程的理论
进程:正在进行的一个程序或者说一个任务,而负责执行任务的则是CPU
进程运行的的三种状态:
1.运行:(由CPU来执行,越多越好,可提高效率)
2.阻塞:(遇到了IQ,3个里面可以通过减少阻塞有效的来提高效率)
3.就绪:(等待CPU来执行的过程)

知识点二:开启进程的两种方式

  开启进程:开启进程就是将父进程里面串行执行的程序放到子进程里,实现并发执行,这个过程中,会将父进程数据拷贝一份到子进程。
  运行角度:是2个进程
  注意:子进程内的初始数据与父进程的一样,如果子进程被创建了被运行了,那么
     子进程里面数据更改对父进程无影响,2个进程是存在运行的

方式一:通过调用multiprocessing模块下面的Process类方法

#方式一:通过调用multiprocessing模块下面的Process类方法

'''
p = Process(target=task, args=('子进程',)) :
target=task:指定执行任务的目标是谁 args:后面跟元组,是给target指定函数传的参数
p=Process(..)相当于是对类Process进行实例化得到了P对象
'''
from multiprocessing import Process
import time
def task(x):
print("%s is runnin"%x) #子进程打印输出
time.sleep(3)
print('%s is done'%x) #子进程打印输出 if __name__ == '__main__': #开进程要统一放到main方法的下面
p=Process(target=task,args=('子进程',))
p.start()
print('主') #父进程的打印输出 '''
注意点:
1.p=Process(target=task,args=('子进程',))
这一步:只是在向操作系统发我要开启一个子进程的信号(具体开子进程的操作是由操作系统来完成的)
*所有这个过程中的时间也是不固定的
2.p.start():
开启一个子进程 运行过程分析:
右键运行父类先运行起来(此时p.start()子类也已经在造了,但是会有时间延迟)-->print('主')-->
然后依次运行子进程里面内容;子进程 is runnin\子进程 is done '''

方式二:借助process类,自定义一个类(继承Process),从而造一个对象

#方式二:借助process类,自定义一个类(继承Process),从而造一个对象
from multiprocessing import Process
import time class Myprocess(Process):
#辅助理解,
# def __init__(self,x):
# super().__init__()#保留原有Process类里面的方法
# self.name=x #***如果要自定义传参,self.name=x必须要放到super()._init_()下面
#
def run(self):
print("%s is running" % self.name) #默认函数对象有name方法 ,结果为:Myprocess-1
time.sleep(3)
print('%s is done' % self.name) if __name__ == '__main__':
# p=Myprocess('子进程1',) 开启init方式就可以自定义参数传值
p=Myprocess() #实例化Myprocess类调用了类面的init方法,得到了一个对象p p1=Myprocess() p.start() #p.run() 对象去调用了类里面的run方法,进而执行run里面的函数体代码
p1.start()
print('主')

以上2中方式的对比分析:

方式二:子类只能运行同一个run里面输出的方式(run名字是固定的,不能更改)

方式一:可以自定义多个task函数,并且写不同的输出内容,例如task1-->p1 task2-->p2...等等灵活性更高

 

父类、子类进程内存空间是彼此隔离的:

from multiprocessing import Process
import time x=100
def task():
global x
x=11 #当子类已经建立成功时,子类里面对数据的变动,不会印象父类
print(x) #
print('done')
if __name__ == '__main__':
p=Process(target=task)
p.start()
time.sleep(10) # 让父进程在原地等待10,是为了等父类先建立好,用于验证子类里面的变动不会影响父类的值
print(x) #打印时父类的,即全局的 100

 

 知识点三:僵尸进程、孤儿进程

  僵尸进程:(无害的)
  子进程运行结束后,会保留进程的ID号等信息,
  目的是为了父进程能查看子进程的状态,以及回收僵尸状态的子进程

  孤儿进程:(无害的)
  在子类没有运行完的情况下,父类先行结束,这种情况下,当子进程结束时,
  状态就叫做孤儿进程,当然也会被系统层面上的孤儿院回收

  有一种情况是有害的:
  如果父类,不停的在造子类,父类一直不死,此时PID会占用过多,导致内存也会占用很多
  这种情况是有害的

 知识点四:进程对象相关的属性

1.PID接口查看

#查看PID应用:
# print(p.pid):外面直接查看子类pid
#os.getpid():在内部查看子类pid
#os.getpid():在外面查看父类的pid
#os.getppid():在里面查看父类的pid
import time
import os
from multiprocessing import Process def task(x): print('%s is running'%os.getpid()) #子进程内查看自己pid的方式
time.sleep(100)
print('子类下查看父类的id:%s'%os.getppid()) #查看父类的pid
time.sleep(100)
print('%s is done'%x) if __name__ == '__main__':
p=Process(target=task,args=('子进程1',))
p.start()
print(p.pid,) #父进程内查看子类pid的方式
time.sleep(50)
print('父类下查看父类自己的id:',os.getpid())
print('主')

2.join()

import time
from multiprocessing import Process def task(name,n):
print('%s is running'%name)
time.sleep(n)
print('%s is done'%name) if __name__ == '__main__':
p1=Process(target=task,args=("进程1",1)) #用时1s
p2=Process(target=task,args=("进程2",2)) #用时1s
p3=Process(target=task,args=("进程3",3)) #用时1s start_time=time.time()
p1.start()
# p1.join() #如果是这种情况就是总共6s左右了
p2.start()
# p2.join()
p3.start()
# p3.join() # 让父进程在原地等待,等子进程在运行完毕后,才执行下一行代码()
#注意:并不是串行,当第一秒在运行p1时,其实p2、p3也已经在运行,当1s后到p2时只需要再运行1s就到p3了,到p3也是一样。
p1.join()
p2.join()
p3.join()
stop_time=time.time() #3.2848567962646484总结
print(stop_time-start_time)
print('主')

Python开启进程的2中方式的更多相关文章

  1. Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)

    知识点一: 进程:资源单位 线程:才是CPU的执行单位 进程的运行: 开一个进程就意味着开一个内存空间,存数据用,产生的数据往里面丢 线程的运行: 代码的运行过程就相当于运行了一个线程 辅助理解:一座 ...

  2. [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]

    [操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...

  3. Day9 进程理论 开启进程的两种方式 多进程实现并发套接字 join方法 Process对象的其他属性或者方法 守护进程 操作系统介绍

    操作系统简介(转自林海峰老师博客介绍) #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景: ...

  4. python 开启进程两种方法 multiprocessing模块 介绍

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ...

  5. python实现进程的三种方式及其区别

    在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...

  6. Python—创建进程的三种方式

    方式一:os.fork() 子进程是从os.fork得到的值,然后赋值开始执行的.即子进程不执行os.fork,从得到的值开始执行. 父进程中fork之前的内容子进程同样会复制,但父子进程空间独立,f ...

  7. python创建进程的两种方式

    1.方式1 import time import multiprocessing def task(arg): time.sleep(2) print(arg) def run(): # 进程1 p1 ...

  8. Python创建进程、线程的两种方式

    代码创建进程和线程的两种方式 """ 定心丸:Python创建进程和线程的方式基本都是一致的,包括其中的调用方法等,学会一个 另一个自然也就会了. "" ...

  9. 并发编程---开启进程方式---查看进程pid

    1.开启进程的两种方式 方式一: from multiprocessing import Process import time def task(name): print('%s is runnin ...

随机推荐

  1. CF 55D Beautiful numbers (数位DP)

    题意: 如果一个正整数能被其所有位上的数字整除,则称其为Beautiful number,问区间[L,R]共有多少个Beautiful number?(1<=L<=R<=9*1018 ...

  2. HDU 1850 Being a Good Boy in Spring Festival 在春节做乖孩子(Nim博弈,微变形)

    题意: 思路: 如果全部扑克牌数目异或的结果ans为0,则必输,输出0.否则,必须要给对方一个P状态,可以对所有扑克堆进行逐个排查,将ans^a[i]就可以得到除了a[i]之外其他扑克数的异或结果tm ...

  3. SQL Server将列以分隔符分割后存到临时表

    begin if object_id('tempdb..#t') is not null drop table #t; create table #t ( filepath ) ); declare ...

  4. PAT (Basic Level) Practise (中文)- 1013. 数素数 (20)

    http://www.patest.cn/contests/pat-b-practise/1013 令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有 ...

  5. HTML5<nav>元素

    HTML5中<nav>元素定义页面导航链接的部分区域,但并不是所有的链接都放到nav元素里面. 实例: <header id="pageHeader"> & ...

  6. Unity3d 中键值监听方法

    unity3d的api中没有负责监听键值的方法,不过unity的input类是通过c#类获取各类监听事件,所以我们可以通过c#类监听,方法如下: void OnGUI() { Event e = Ev ...

  7. iOS9适配总结

    每年iOS升级,都会带来一些坑,这次iOS9也不例外.本文总结了微信在适配iOS9上遇到的问题和解决方案. 一.iOS9问题汇总   1. 编译问题(Bitcode) 大部分人升级到Xcode7后,首 ...

  8. 【思维题 线段树】cf446C. DZY Loves Fibonacci Numbers

    我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...

  9. k8s搭建WebUI--Dashborad管理界面

    k8s的webUI管理界面可以更好更直观更便捷的让我们去管理我们的k8s集群. 我们知道,由于某些原因我们无法直接拉取dashboard的镜像,但是国内有些人已经将镜像下载到dockerhub中可以给 ...

  10. Flask-蓝图、模型与CodeFirst

    一.应用.蓝图与视图函数 结构,如图: Flask最上层是app核心对象 ,在这个核心对象上可以插入很多蓝图,这个蓝图是不能单独存在的,必须将app作为插板插入app ,在每一个蓝图上,可以注册很多静 ...