并发编程

并发编程的理论
python中实现多进程

进程测试

import os

import time
while True:
time.sleep(0.5)
print("hahaha")
print("self", os.getpid()) #获取自己的进程id
print("parent",os.getppid()) #parent 获取父进程的id

开启进程的两种方式

from multiprocessing import Process
import os #
def task(name):
print(name)
print("self",os.getpid())
print("parent", os.getppid())
print("task run") # windows创建子进程时 子进程会将父进程的代码加载一遍 导致重复创建子进程
# 所以一定要将 创建子进程的代码放到main的下面
if __name__ == '__main__':
print("self", os.getpid())
print("parent", os.getppid())
p = Process(target=task, name="这是子进程!",kwargs={"name":"bgon"}) # 创建一个表示进程的对象 但并不是真正的创建进程
p.start() # 给操作系统发送通知 要求操作系统开启进程 # 创建进程的第二种方式 继承Process 覆盖run方法
# 在子进程启动以后会自动执行run方法
# 其优势是 可以自定义 进程的属性和行为 来完成一些额外任务 例如下载
# class MyProcess(Process):
#
# def __init__(self,url):
# self.url = url
# super().__init__()
#
# # 子类中的方法 只有run会被自动执行
# def run(self):
# print("下载文件...." , self.url)
# print(" run run run!")
#
# def task(self):
# pass
#
# def task():
# print(123) # if __name__ == '__main__':
# p = MyProcess("www.baidu.com/xx.mp4")
# p.start()

进程间内存相互独立

from multiprocessing import Process

import time
a = 1000000000000 def task():
global a
print(id(a))
a = 0
print("子进程的",a) if __name__ == '__main__':
print(id(a))
p = Process(target=task)
p.start() # 给操作系统发送请求后 代码继续往下运行 至于子进程 什么时候创建 什么是执行 都跟当前进程没关系 time.sleep(1)
print("自己的",a) # 子进程中的数据修改 不会影响父进程

父进程通过join()函数来等待子进程运行完,再往下运行

import time
from multiprocessing import Process # def task():
# print("上传文件....")
# time.sleep(3)
# print("上传结束...")
#
#
# # [进程1,进程2,进程3]
#
# if __name__ == '__main__':
# p = Process(target=task)
# p.start()
#
# p.join() # 本质上 是提高了子进程优先级 当CPU在切换时 会优先切子进程
#
# print("上传文件成功!") def task(num):
print("我是%s号 进程" % num)
time.sleep(2)
print("=========") if __name__ == '__main__':
start_time = time.time()
ps = []
for i in range(3):
p = Process(target=task,args=(i,))
p.start()
print("----")
# ps.append(p) for p in ps:
p.join() print(time.time()-start_time)
print("over")

process常用属性

from multiprocessing import  Process

import  time
def task():
time.sleep(3)
print("执行完毕!") if __name__ == '__main__': p = Process(target=task,name="alex")
p.start()
print(p.name) # time.sleep(1)
# print(p.is_alive())
#
# p.terminate() # 终结子进程的运行
#
# print(p.is_alive()) # 由于子进程被终结,所有不再存活,alive状态为False p.terminate()# 终止这个进程
print(p.pid)
p.daemon # 守护进程

僵尸进程

假如子进程已经运行完了,但是主进程还在运行,也没有去对运行完的子进程做回收操作,那么这些子进程就一直占用着系统资源,直到父进程关闭,所有无用的占用着系统资源,是僵尸进程

import  time
import os
from multiprocessing import Process
def task1():
print("子进程 run")
print(p.pid) if __name__ == '__main__':
for i in range(10):
p = Process(target=task1)
p.start()
print(os.getpid()) time.sleep(100000)

小结

1. 并发编程

让你的程序可以同时处理多个任务

2.并发的基石是 多道技术

空间复用: 同一时间 内存存储了多个应用程序
不同应用程序之间的内存是相互独立的
时间复用: 当一个程序遇到了IO操作时 会切换到其他应用程序 ,以此来提高CPU的利用率 多道技术的缺点: 当应用程序都是计算任务时 切换反而降低效率 (但是必须得切 才能保证多任务并发)

3.并发 与 并行

并发 多个事件 同时发生, 也称之为伪并行
并行 多个事件 同时进行, 阻塞和非阻塞 指的是程序的状态
就绪 运行 阻塞

4.两种使用进程的方式

1.直接创建Process对象 指定target参数
2.继承Process 覆盖run方法

5.join函数

提高优先级 使 父进程等待子进程结束

6.孤儿进程与僵尸进程路径(了解)

孤儿进程 是指 父进程已经终止了  但是自己还在运行  是无害的
孤儿进程会自定过继给操作系统 僵尸进程 是指 子进程执行完成所有任务 已经终止了但是 还残留一些信息(进程id 进程名)
但是父进程 没有去处理这些残留信息 导致残留信息占用系统内存
僵尸进程时有害的 当出现大量的僵尸进程时 会占用系统资源 可以把它父进程杀掉 僵尸就成了孤儿 操作系统会负责回收数据

day32 并发编程的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  3. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  4. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  5. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  6. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  7. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  8. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  9. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

随机推荐

  1. 普通rgb转换为16进制

    http://www.zhangxinxu.com/study/201003/color-exchange-test.html

  2. Java Base64 加密/解密

    Base64常用来表示字串加密过后的内容,使用Java 程式语言来实作Base64的编码与解码功能 1.在Java上做Base64的编码与解码,会使用到JDK里sun.misc套件下的BASE64En ...

  3. xml文件中的${}

    看到了${}这样的表达式,脑海里面第一印象是不是我们jsp中的EL表达式?! 哈哈... 不过,这个真不是EL表达式,Spring提供了自己的EL表达式,可是它的格式是#{} so.... ${key ...

  4. Memcache操作类

    using Memcached.ClientLibrary; using System; using System.Collections.Generic; using System.Linq; us ...

  5. JVM的 GC机制和内存管理

    GC机制:java垃圾回收机制,垃圾收集器线程(Garbage Collection Thread)在 JVM 处于空闲循环式,会自动回收无用的内存块. 垃圾收集算法:1.引用计数  2.根搜索  3 ...

  6. Windows下如何查看某个端口被谁占用

    开发时经常遇到端口被占用的情况,这个时候总是很令人抓狂,知道被哪个进程占用还好,结束就是了,要是不知道我们该怎么办呢? 我告诉大家一个方法,^_^. 1. 开始—->运行—->cmd,或者 ...

  7. 排序NB三人组

    排序NB三人组 快速排序,堆排序,归并排序 1.快速排序 方法其实很简单:分别从初始序列“6  1  2 7  9  3  4  5 10  8”两端开始“探测”.先从右往左找一个小于6的数,再从左往 ...

  8. DOM节点的增删改查以及class属性的操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 飞利浦 PHILIPS 电动牙刷HX6730 拆解

    今日,一直比较喜欢用的电动牙刷,飞利浦HX6730坏掉了,初步感觉考虑飞利浦的保修,但是发现发票找不到了.飞利浦的客服也说,电动牙刷的两年保修依据分别是:1.发票开据日期:2.在无发票的情况下,看底部 ...

  10. ElasticSearch centos7 安装

    参考: https://blog.csdn.net/u014180504/article/details/78733827 https://blog.csdn.net/youzhouliu/artic ...