复习:

  线程与进程的区别:

    进程:资源的集合

    线程:最小调度单位

  • 进程至少包含一个线程
    • 线程之间的内存是共享的,两个线程操作同一个数据就会修改整个结果(需要mutex加锁来保持数据的一致性),递归锁,join(等待线程执行完成)

信号量:也相当于是lock

    守护线程:服务于非守护线程;

    quene:程序的解耦;提高效率;也是有序的容器;队列只有一份数据,取完了就没有了

        先进先出(FIFO)

        后进先出(LIFO)

    生产者消费者模型:也就是为了实现解耦

    event:事件---红绿灯实验

i/o不占用cpu,计算占用

python多线程不适合cpu密集型操作任务,适合i/o密集型任务

推荐的书:

  《失控》,《必然》

  《数学之美》,《浪潮之巅》

鸡汤总结:做一个有素质的人

今天的课程:

  1. govent协程
  2. select\poll\epoll异步I/O事件驱动
  3. python连接mysql的基本操作
  4. rabbitmq队列
  5. redis/memcached缓存
  6. paramiko ssh
  7. 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自动化第十篇:】的更多相关文章

  1. 【python自动化第十一篇】

    [python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...

  2. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  3. python自动化运维篇

    1-1 Python运维-课程简介及基础 1-2 Python运维-自动化运维脚本编写 2-1 Python自动化运维-Ansible教程-Ansible介绍 2-2 Python自动化运维-Ansi ...

  4. Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)

    简介 你有道灵光从天灵盖喷出来你知道吗,年纪轻轻就有一身横练的筋骨,简直百年一见的练武奇才啊,如果有一天让你打通任督二脉,那还不飞龙上天啊.正所谓我不入地狱谁入地狱,警恶惩奸维护世界和平这个任务就交个 ...

  5. Python 学习 第十篇:正则表达式 - re

    规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索.替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到 ...

  6. Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)

    简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...

  7. Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁

    本节内容: 进程与线程区别 线程 a)  语法 b)  join c)  线程锁之Lock\Rlock\信号量 d)  将线程变为守护进程 e)  Event事件 f)   queue队列 g)  生 ...

  8. Python自动化 【第二篇】:Python基础-列表、元组、字典

    本节内容 模块初识 .pyc简介 数据类型初识 数据运算 列表.元组操作 字符串操作 字典操作 集合操作 字符编码与转码 一.模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库, ...

  9. Python自动化 【第一篇】:Python简介和入门

    Python简介: 一.什么是python Python是一门动态解释性的强类型定义语言. pythonde 特点:“优雅”.“明确”.“简单”. 二.Python由来 python的创始人为吉多·范 ...

随机推荐

  1. 服务器环境搭建系列(三)-JDK篇

    1.如果系统已经有jdk,卸载之. rpm -qa|grep java rpm -e --nodeps 上面命令返回的软件包名字 或者 yum -y remove 上面命令返回的包名 下载bin文件, ...

  2. jersey post提交到 ContainerRequestFilter 而HttpServletRequest获取不到数据(转)

     jersey post提交到 ContainerRequestFilter 而HttpServletRequest获取不到数据 问题:在serverfilter request获取不到post提交的 ...

  3. POJ 2375 Cow Ski Area[连通分量]

    题目链接:http://poj.org/problem?id=2375题目大意:一片滑雪场,奶牛只能向相邻的并且不高于他当前高度的地方走.想加上缆车是的奶牛能从低的地方走向高的地方,求最少加的缆车数, ...

  4. HDU 1754 I Hate It(线段树)

    点我看题目 题意  :又是一道中问题,我就不说题意了.... 思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了. #include <iostream> #include & ...

  5. activity的测试工程activiti-explorer使用

    1. activiti-explorer默认使用h2数据库,第一步要修改db.properties的配置,如果使用其他数据库的话,务必放入驱动包,oracle的ojdbc4不能用,会报错,要使用版本高 ...

  6. [杂题]CSUOJ1413 Area of a Fractal

    题目链接 题意:题中给了图,所以不看字大概也知道  求的是第n个图形的面积. 就是找规律 递推 一类的... 先给结论: 很鬼畜的公式:    $\displaystyle\frac{3\times ...

  7. [jobdu]第一个只出现一次的字符

    刚开始还在想双指针,完全没必要.然后最土的可以扫两遍O(n),用一个数组记录出现次数.然后想到如果数组里记录出现的位置,可以只扫一遍O(n),第二遍扫字符集就行了. #include <iost ...

  8. NGUI所见即所得之UIAtlasMaker , UIAtlas (2)

    本文的重点就是要将NGUI把多张图片打成一个图集(Atlas)的原理和过程研究下,学习下Unity提供的api和NGUI写的功能以及设计思想. (原文链接) 其它链接:NGUI所见即所得之UIRoot ...

  9. js中JSON对象和字符串对象相互转化

    JSON.stringify(value [, replacer] [, space]) //作用,将json数据转化为字符串value:是必须要的字段.就是你输入的对象,比如数组啊,类啊等等. re ...

  10. SQL Server中时间段查询

    /****** Script for SelectTopNRows command from SSMS ******/ select * from dbo.VehicleData20100901 wh ...