【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的创始人为吉多·范 ...
随机推荐
- display:inline-block元素间空白间隙问题
display:inline-block元素间有空白间隙,可以在父元素上加font-size:0
- 全国省市级联数据sql语句 mysql版
全国省市级联数据sql语句 mysql版 --省级 provincial create table provincial ( provincialID int, provincialName ), p ...
- portal、portlet、portlet容器三个概念
什么是portal Portlet规范中是这样定义portal的: A portal is a web based application that –commonly- provides perso ...
- DOM in Angular2
<elementRef> import {ElementRef} from "@angular/core"; constructor(private element: ...
- 2D多边形碰撞器优化器
http://www.unity蛮牛.com/thread-19827-1-1.html http://pan.baidu.com/s/1qW2mWS8 Asset Store Link: http: ...
- 从一个脚本谈loadrunner的脚本初始化
昨天一个同事问我,如何实现下列代码中 InputStream类is对象的实例化? * LoadRunner Java script. (Build: _build_number_) * * Scrip ...
- DLX模板
对于数独问题 ; //3*3数独 ; // 一格能填9个数 9*9格 +; // 9*9*4=(9+9+9)*9+9*9 (9+9+9)是9行 9列 9格 *9是9个数 9*9是81个格子 +MaxM ...
- 丢手帕问题(环形链表)---Java 待优化
/** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...
- 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能
package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...
- Sublime Text个性化设置
个性化格式化代码快捷键 其余快捷键设置方法类似,但注意不要与软件自带快捷键冲突 选择Preferences,点击Key Bingdings - User 在打开的文件中添加,其中ctrl+alt+sp ...