【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的创始人为吉多·范 ...
随机推荐
- 正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
困扰了两天的问题,非常头疼,今天终于有了解决思路了,说到底,还是对maven不够了解吧.总是抱怨maven不好用,出现各种无厘头的问题,原来这些都是归于对它不够了解不够熟悉,它提供了很好的解决思路,只 ...
- 20 个最棒的 jQuery Tab 插件
jQuery Tab 常用来做网页上的选项设置界面和导航,本文向你推荐最棒的 20 个 jQuery Tab 插件.Enjoy !! 1. Slider Tabs SliderTabs 是一个可定制的 ...
- portlet初学习及HelloWorld例子
1. 在myeclipse中新建一个web project,在src中新建如下类: package com.yoyo.portlet; import java.io.IOException; impo ...
- unity Android 打包后读取 xml 文件
原地址:http://www.cnblogs.com/wuzhang/p/wuzhang20140731.html 问题: 前天在做东西的过程中发现了一个让人很纠结的问题,为什么Unity 程序 ...
- Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
在windows的cmd命令行下,使用Python的PIL库打开并显示一个jpg图片: ? 1 2 3 openedImg = Image.open(saveToFile); print " ...
- [Gauss]POJ2947 Widget Factory
题意: 有n种小工具要加工,每种工具的加工时间为3到9天,给了m条加工记录. 每条记录 X $s_1$ $s_2$ 分别代表 这个工人在$s_1$到$s_2$(前闭后闭)的时间里加工了X件小工具 ...
- JAVA 字符串编码总结
java 为了解决跨平台,字符串编码的有点特殊 String newStr = new String(oldStr.getBytes(), "UTF-8");java中的Strin ...
- AHB总线和APB总线
AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作:非三态的实现方式:支持突发传输:支持分段传输:支持多个主控制器:可配置 ...
- android usb host 读写USB设备
自android3.1以后android增加了操作USB设备的API. 官网地址:http://developer.android.com/guide/topics/connectivity/usb/ ...
- Android imageview显示圆形图片
需要ImageView显示圆形图片做法如下 public static Bitmap toRoundCorner(Bitmap bitmap, float ratio) { System.out.pr ...