【python自动化第十篇:】
复习:
线程与进程的区别:
进程:资源的集合
线程:最小调度单位
- 进程至少包含一个线程
- 线程之间的内存是共享的,两个线程操作同一个数据就会修改整个结果(需要mutex加锁来保持数据的一致性),递归锁,join(等待线程执行完成)
信号量:也相当于是lock
守护线程:服务于非守护线程;
quene:程序的解耦;提高效率;也是有序的容器;队列只有一份数据,取完了就没有了
先进先出(FIFO)
后进先出(LIFO)
生产者消费者模型:也就是为了实现解耦
event:事件---红绿灯实验
i/o不占用cpu,计算占用
python多线程不适合cpu密集型操作任务,适合i/o密集型任务
推荐的书:
《失控》,《必然》
《数学之美》,《浪潮之巅》
鸡汤总结:做一个有素质的人
今天的课程:
- govent协程
- select\poll\epoll异步I/O事件驱动
- python连接mysql的基本操作
- rabbitmq队列
- redis/memcached缓存
- paramiko ssh
- twisted网络框架
一、多进程
解决多核问题而生
单个进程:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import multiprocessing,time
def run(name): #定义函数
time.sleep(1)
print('hello',name)
if __name__ == '__main__':
p = multiprocessing.Process(target=run,args=('hehe',)) #实例化一个进程
p.start() #执行进程
p.join() #进程等待
多进程:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import multiprocessing,time def run(name):
print('hello',name)
time.sleep(1)
if __name__ == '__main__':
for i in range(10): #定义循环
p = multiprocessing.Process(target=run,args=("hehe %s"%i,))
p.start()
获取进程id:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import multiprocessing,os def info(title): #信息展示函数
print(title)
print('module name:',__name__) #打印模块名称
print('parent process id',os.getppid()) #父进程id获取
print('process id',os.getpid()) #当前进程id
print('\n\n') def f(name): #定义功能函数
info('\033[31;1mfunction f\033[0m')
print('hello',name) if __name__ == '__main__': #主进程调用
info('\033[32;1mmain process line\033[0m')
p = multiprocessing.Process(target=f,args=('hehe',)) #定义进程
p.start() #开始进程
p.join() #进程等待
每一个子进程都是有其父进程启动的
进程间通信:Queue
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Queue,Process def f(qq):
qq.put([122,None,'heheheda']) #父进程放入数据 if __name__ == '__main__':
q = Queue()
p = Process(target=f,args=(q,)) #将q传给子进程p
p.start()
print(q.get())
p.join()
此时的q也就是pickle序列化和 反序列化之后的结果了,实现了进程间的通信
管道pipe:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process,Pipe def f(conn):
conn.send([123,'sada',None]) #子进程send数据
conn.send([12223,'s343ada321',None]) #子进程send数据
print(conn.recv()) #子进程接受父进程数据
conn.close() if __name__ == '__main__':
parent_conn,chile_conn = Pipe() #生成一个管道实例
p = Process(target=f,args=(chile_conn,)) #实例化
p.start()
print(parent_conn.recv()) #父进程接收数据
print(parent_conn.recv()) #父进程接收数据
# print(parent_conn.recv()) #父进程接收数据,如果子进程不发送数据,父进程就处于等待状态
parent_conn.send('hello child!!') #父进程给子进程发送数据
p.join()
mananger:实现进程间数据共享
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
from multiprocessing import Manager,Process
import os
def f(d,l):
d[os.getpid()] = os.getpid() #获取pid
l.append(os.getpid())
print(l)
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict() #生成一个字典,可在多个进程间共享和传递
l = manager.list(range(5)) #生成一个列表,可在多个进程间共享和传递数据
p_list = []
for i in range(5):
p = Process(target=f,args=(d,l))
p.start()
p_list.append(p)
for res in p_list: #等待结果
res.join()
print(d)
print(l)
结果如下:
D:\pythom35\python.exe D:/project/s14/day10/manager2.py
[0, 1, 2, 3, 4, 7828]
[0, 1, 2, 3, 4, 7828, 4180]
[0, 1, 2, 3, 4, 7828, 4180, 1800]
[0, 1, 2, 3, 4, 7828, 4180, 1800, 8076]
[0, 1, 2, 3, 4, 7828, 4180, 1800, 8076, 7264]
{1800: 1800, 4180: 4180, 8076: 8076, 7828: 7828, 7264: 7264} #进程字典打印结果
[0, 1, 2, 3, 4, 7828, 4180, 1800, 8076, 7264]
进程锁:实现进程同步
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process,Lock
def f(l,i):
'''
:param l: 锁
:param i: 传进来的内容
:return:
'''
# l.acquire()
print('hehehe',i)
#l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(100): #修改进程的启动数量
Process(target=f,args=(lock,num)).start() #启动进程
进程池:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process,Pool
import time,os
def Foo(i):
time.sleep(1)
print('in process',os.getpid())
return i + 100
def Bar(arg):
print("-->exec done",arg,os.getpid()) #获取子进程pid
if __name__ == '__main__':
pool = Pool(5) #允许进程池里同时放入5个进程
print('主进程',os.getpid()) #获取主进程pid
for i in range(10): #启动10个进程
pool.apply_async(func=Foo,args=(i,),callback=Bar) #异步执行(并行),需要执行join ,callback:回调
#pool.apply(func=Foo,args=(i,)) #将Foo放入进程池,串行
print('end')
pool.close()
pool.join() #进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。.join()
二、协程
又名微线程,轻量级线程;
协程拥有自己的寄存器上下文和栈;协程
【python自动化第十篇:】的更多相关文章
- 【python自动化第十一篇】
[python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...
- Python 学习 第十篇 CMDB用户权限管理
Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...
- python自动化运维篇
1-1 Python运维-课程简介及基础 1-2 Python运维-自动化运维脚本编写 2-1 Python自动化运维-Ansible教程-Ansible介绍 2-2 Python自动化运维-Ansi ...
- Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)
简介 你有道灵光从天灵盖喷出来你知道吗,年纪轻轻就有一身横练的筋骨,简直百年一见的练武奇才啊,如果有一天让你打通任督二脉,那还不飞龙上天啊.正所谓我不入地狱谁入地狱,警恶惩奸维护世界和平这个任务就交个 ...
- Python 学习 第十篇:正则表达式 - re
规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索.替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到 ...
- Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)
简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...
- Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁
本节内容: 进程与线程区别 线程 a) 语法 b) join c) 线程锁之Lock\Rlock\信号量 d) 将线程变为守护进程 e) Event事件 f) queue队列 g) 生 ...
- Python自动化 【第二篇】:Python基础-列表、元组、字典
本节内容 模块初识 .pyc简介 数据类型初识 数据运算 列表.元组操作 字符串操作 字典操作 集合操作 字符编码与转码 一.模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库, ...
- Python自动化 【第一篇】:Python简介和入门
Python简介: 一.什么是python Python是一门动态解释性的强类型定义语言. pythonde 特点:“优雅”.“明确”.“简单”. 二.Python由来 python的创始人为吉多·范 ...
随机推荐
- 日均百万 PV 的站点如何做性能监测?试试「3M口罩」!
对很多开发者而言,如果网站的日流量达到百万级别,峰值 PV 也突破了 3 万,这样的站点在线下测试的时候总是让人心力交瘁.... 生产环境下的性能监测问题更是尤其让人头疼! 开发同学在想,运维人员也在 ...
- SDUT 2622 最短路径(Dijkstra)
点我看题目 题意 :中文不详述. 思路 :因为这个题加了一个要求就是路径数目得是x的倍数.所以在原来算法的一维dis数组增加到二维,用来存走的路径数%x.也可以用spfa做. #include < ...
- hdu 4878 ZCC loves words AC自动机+中国剩余定理+快速幂
题意就不说了. 分析:折腾好几天自己写的代码还是看了别人代码后发现几乎没什么复杂度的差别,可是就是一直超时,后来干脆照着别人写啊,一直WA,就在准备放弃干脆先写这篇博客的时候,又看了一眼WA的代码,发 ...
- MyBatis 学习入门
mybatis 第一天 mybatis的基础知识 持久层的框架,对jdbc的封装 课程安排 第一天:基础知识(重点,内容量多) 最简单的jdbc程序 public class JdbcTest{ pu ...
- Universal Asynchronous Receiver/Transmitter
USART簡介與特性 NRZ標準資料格式(Mark/Space) 半雙工/全雙工 Synchronous 同步傳輸 CLOCK SKEW Asynchronous 非同步傳輸 半/全雙工.同步/非同步 ...
- 《深入理解linux内核》第二章 内存寻址
三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和 ...
- SpeeDO —— 并行深度学习系统
SpeeDO —— 并行深度学习系统 摘要: 最近,AlphaGo又带起了一波深度学习的热潮.深度学习在很多领域都大幅提高了模型的精度,使得很多以前在实验室中的技术得以运用到日常的生活之中.然而, ...
- oracle删除列
ALTER TABLE 表名 DROP COLUMN 列名;
- bzoj列表3
水题列表 bzoj2429 裸的最小生成树 bzoj1567 二分答案+hash判断,判断序列.矩阵是否相同常用hash bzoj1087 简单的状压dp bzoj1754 高精度乘法,模拟竖式即可
- 浅谈 HTML5 的 DOM Storage 机制 (转)
在开发 Web 应用时,开发者有时需要在本地存储数据.当前浏览器支持 cookie 存储,但其大小有 4KB 的限制.这对于一些 Ajax 应用来说是不够的.更多的存储空间需要浏览器本身或是插件的支持 ...