第九章并发编程

同一个程序执行多次是多个进程

import time
import os

print('爹是:',os.getppid()) #父进程PID,(pycharm)
print('me是: ',os.getpid()) #3748 14648
time.sleep(500)

9.1 开启子进程的两种方式

服务端目标: 1、不间断地提供服务 2、服务端要支持高并发+高性能

一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)

父进程发起请求,操作系统创建子进程

方式一:

from multiprocessing import Process
import time
import os
def task(name):
print('%s is running' %name)
time.sleep(3)
print('%s has done' %name)
print('爹是:', os.getppid()) #me是: 13892
print('me是: ', os.getpid()) #me是: 7492

if __name__ == '__main__': # windows系统,开启子进程的操作一定要放到这下面
p=Process(target=task,args=('egon',)) # p=Process(target=task,kwargs={'name':'egon'})
p.start() # 向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态
print('me是: ', os.getpid()) #me是: 13892
print('======主')#======主 egon is running egon has done
  • target 表示调用对象,即子进程要执行的任务

  • args 指定为target函数传位置参数,是一个元组形式,必须有逗号

  • kwargs 表示调用对象的字典,kwargs={'name':'egon','age':18}

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

方式二:

from multiprocessing import Process
import time

class MyProcess(Process):
def __init__(self,name):
super(MyProcess,self).__init__()
self.name=name

def run(self):
print('%s is running' %self.name)
time.sleep(3)
print('%s has done' %self.name)

if __name__ == '__main__':
p=MyProcess('egon')
p.start()
print('主') #主 egon is running egon has done
  • p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法

9.2 进程之间内存空间隔离

from multiprocessing import Process
import time
x=1000
def task():
time.sleep(3)
global x
x=0
print('儿子死啦',x)


if __name__ == '__main__':
print(x)
p=Process(target=task)
p.start()
time.sleep(5)
print(x) #1000 儿子死啦 0 1000

9.3 父进程等待子进程结束

from multiprocessing import Process
import time
x=1000
def task():
time.sleep(3)
global x
x=0
print('儿子死啦',x)

if __name__ == '__main__':
p=Process(target=task)
p.start()

p.join() # 让父亲在原地等
print(x)
from multiprocessing import Process
import time
x=1000
def task(n):
print('%s is runing' %n)
time.sleep(n)

if __name__ == '__main__':
start_time=time.time()
p_l=[]
for i in range(1,4):
p=Process(target=task,args=(i,))
p_l.append(p)
p.start()

for p in p_l: #1 is runing
p.join() #3 is runing
print('主',(time.time() - start_time)) #2 is runing 主 3.112313

9.4 进程对象的其他属性

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

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

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

  • p.pid:进程的pid

from multiprocessing import Process
import time,os
x=1000
def task(n):
print('%s is runing self:%s parent:%s' %(n,os.getpid(),os.getppid()))#self:13032 parent:9136
time.sleep(3)

if __name__ == '__main__':
p1=Process(target=task,args=(1,),name='任务1')#不指定name,p1.name是process-1
p1.start() print(p1.pid) # 13032 没有p1.ppid
print(p1.name) # 任务1
p1.terminate() # 向操作系统提交进程终止
p1.join()
print(p1.is_alive()) # False

print('主',os.getpid())# 主 9136

python 之 并发编程(开启子进程的两种方式,进程对象的属性)的更多相关文章

  1. 并发编程 - 进程 - 1.开启子进程的两种方式/2.查看pid/3.Process对象的其他属性或方法/4.守护进程

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

  2. Process 开启子进程 的两种方式、join控制子进程、守护进程

    一.join控制子进程的一种方式 当主进程需要在子进程结束之后结束时,我们需要用到join来控制子进程. import time import random from multiprocessing ...

  3. python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)

    9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...

  4. python 并发编程 多线程 开启线程的两种方式

    一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 二 开启线程的两种方式 第一种 每造一个进程,默认有一个线程,就是 ...

  5. 并发编程 - 线程 - 1.开启线程的两种方式/2.进程与线程的区别/3.Thread对象的其他属性或方法/4.守护线程

    1.开启线程的两种方式: 进程,线程: 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位) 1.同一个进程内的多个线程共享该进程内的地址资源 2.创建线 ...

  6. Python 35 线程(1)线程理论、开启线程的两种方式

    一:线程理论 1 什么是线程 进程其实一个资源单位,而进程内的线程才是cpu上的执行单位 线程其实指的就是代码的执行过程2 为何要用线程   线程vs进程     1. 同一进程下的多个线程共享该进程 ...

  7. python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  8. DJango中开启事务的两种方式

    目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...

  9. 并发编程 ~~~ 多进程~~~进程创建的两种方式, 进程pid, 验证进程之间的空间隔离, 进程对象join方法, 进程对象其他属性

    一 进程创建的两种方式 from multiprocessing import Process import time def task(name): print(f'{name} is runnin ...

随机推荐

  1. Liskov替换原则(LSP)

    OCP背后的主要机制是抽象和多态.在静态类型语言中,比如C++和Java,支持抽象和多态的关键机制之一是继承.正是使用了继承,才可以创建实现其基类中抽象方法的派生类.是什么设计规则在支配着这种特殊的继 ...

  2. 高可用Redis:Redis Cluster

    转(https://www.cnblogs.com/renpingsheng/p/9862485.html) Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Red ...

  3. html5中time元素详解

    html5中time元素详解 一.总结 一句话总结: time的使用的话主要是将时间放在datetime属性里面:<time datetime="2015-10-22"> ...

  4. 数据库中的blob是什么类型?

    数据库中的blob是什么类型? BLOB (binary large object)----二进制大对象,是一个可以存储二进制文件的容器. 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类 ...

  5. Java基础 Scanner 使用nextLine接收字符串

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  6. expandablelistView 可展开的列表

    这个东西用法基本固定,不知道能不能做三级的展开. 界面代码 <?xml version="1.0" encoding="utf-8"?> <L ...

  7. npm使用国内源

    npm使用国内源 转   https://www.jianshu.com/p/7e84d7b119bc $ npm install -g cnpm --registry=https://registr ...

  8. ubuntu 关于curses头文件问题

    执行编译gcc -o badterm badterm.c -lcurses后报错情报如下:term.h: 没有那个文件或目录curses.h: 没有那个文件或目录很明显,程序找不到term.h和cur ...

  9. C++的override和final

    1.final用于让虚函数不可被重写 struct B2 { virtual void f() final {} // final 函数 }; struct D2 : B2 { virtual voi ...

  10. python学习:python打包成exe

    1) 安装pyinstaller pip install pyinstaller 目前已经支持 python 3.7 版本 2) 打开cmd窗口,进入到要打包的python文件所在目录, pyinst ...