一、线程

线程是程序工作的最小单元,由进程生成,生成的线程间会共享内存空间。Python中创建线程比较简单,导入threading模块,创建线程实例。下面这段代码是一个简单的多线程例子

 import threading
import time
def func(i):
time.sleep(1)
print (i) for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start() >>> 1
0
5
4
3
2
7
8
6
9

该段代码创建了10个线程,打印出每个线程的编号,可以看到线程是并发执行的,并且打印数字的顺序也不一样,这是因为CPU调度线程的顺序不一样。

threading方法:

  • t.start()  激活线程
  • t.getName()  获取线程的名称
  • t.setName()  设置线程名称
  • t.name()  获取或设置线程的名称
  • t.is_alive()  判断线程是否为激活状态
  • t.isAlive()  判断线程是否为激活状态
  • t.setDaemon  将线程设置为前台或后台线程。后台线程是指:当主线程执行完毕后,不管子线程是否执行完,程序就此停止。如果是前台线程,主线程执行完后会等待子线程执行完毕,程序才会停止。
  • t.isDaemon()  判断是否为后台进程
  • t.join()  逐个执行每个线程,执行完毕后继续往下执行

二、线程锁

锁可以避免同一时间线程间同时操作一个资源时造成严重后果(两个线程同时操作同一资源,得出的结果却不是想要的)。

'''
Created on 2016年7月27日 @author: baitutu
'''
import threading
import time global_var = 0
lock = threading.RLock()#获得锁的实例 def func():
lock.acquire()#获得锁
global global_var
global_var += 1
time.sleep(1)
print(global_var)
lock.release()#释放锁 for i in range(10):
t = threading.Thread(target=func)
t.start()

三、Event

Event用于线程间通信,比如主线程控制其他线程执行。原理是主线程发送信号,其他线程等待信号。

  • Event.wait(timeout)  阻塞线程,直到Event对象标识位设置为True或超时。
  • Event.set()    设置标识位为True
  • Event.clear()    设置标识位为False
  • Event.isSet()    判断标识位是否为True
import threading

def do(event):
print('start')
event.wait() #阻塞线程执行,直到主线程输入true
print('execute') event_obj = threading.Event()#创建Event对象
for i in range(10):#生成10个子线程
t = threading.Thread(target=do, args=(event_obj,))
t.start() event_obj.clear()#标识位置为False
inp = input('input:')
if inp == 'true':
event_obj.set()#设置标识位为True

四、队列

简单理解为一种数据结构,可以用来安全的传递多线程信息。主要有四种,先进先出(queue.Queue()),先进后出(queue.LifoQueue()),优先级队列(queue.PriorityQueue()),双向队列(queue.deque())

queue的主要方法:

  • = queue.Queue(maxsize=0)  # 构造一个先进显出队列,maxsize指定队列长度,为0时,表示队列长度无限制。
  • q.join()        # 等到队列为kong的时候,在执行别的操作
  • q.qsize()       # 返回队列的大小 (不可靠)
  • q.empty()       # 当队列为空的时候,返回True 否则返回False (不可靠)
  • q.full()        # 当队列满的时候,返回True,否则返回False (不可靠)
  • q.put(item, block=True, timeout=None)   # 将item放入Queue尾部,item必须存在,参数block默认为True,表示当队列满时,会等待
  •                         # 为False时为非阻塞,此时如果队列已满,会引发queue.Full 异常。 可选参数timeout,表示会阻塞设置的时间,
  •                         # 如果在阻塞时间里 队列还是无法放入,则引发 queue.Full 异常
  • q.get(block=True, timeout=None)     #  移除并返回队列头部的一个值,可选参数block默认为True,表示获取值的时候,如果队列为空,则阻塞
  •                        #  阻塞的话若此时队列为空,则引发queue.Empty异常。 可选参数timeout,表示会阻塞设置的时间,
  • q.get_nowait()               #  等效于 get(item,block=False) 

生产者消费者模型

import queue
import threading que = queue.Queue(10) def p(i):
que.put(i) #往队列中放数据 def g(i):
g = que.get(i) #从队列中取数据
print("get:", g) for i in range(10):
t = threading.Thread(target=p, args=(i,))
t.start() for i in range(10):
t = threading.Thread(target=g, args=(i,))
t.start()

五、进程

进程间的内存空间都是独占的,因此会比较消耗内存

from multiprocessing import Process

def Foo(a, dic):
dic[a] = 100 + a
print(len(dic)) i = [] if __name__ == "__main__":
for i in range(10):
m = Process(target=Foo, args=(i, dic,))
m.start()
m.join()

六、进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会阻塞,直到进程池中有可用进程为止。

  • apply(func[, args[, kwds]]) :使用arg和kwds参数调用func函数,结果返回前会一直阻塞,由于这个原因,apply_async()更适合并发执行,另外,func函数仅被pool中的一个进程运行。

  • apply_async(func[, args[, kwds[, callback[, error_callback]]]]) : apply()方法的一个变体,会返回一个结果对象。如果callback被指定,那么callback可以接收一个参数然后被调用,当结果准备好回调时会调用callback,调用失败时,则用error_callback替换callback。 Callbacks应被立即完成,否则处理结果的线程会被阻塞。

  • close() : 阻止更多的任务提交到pool,待任务完成后,工作进程会退出。

  • terminate() : 不管任务是否完成,立即停止工作进程。在对pool对象进程垃圾回收的时候,会立即调用terminate()。

  • join() : wait工作线程的退出,在调用join()前,必须调用close() or terminate()。这样是因为被终止的进程需要被父进程调用wait(join等价与wait),否则进程会成为僵尸进程

from multiprocessing import Pool
import time def f1(a):
time.sleep(1)
print(a+1)
return 1000
def f2(a):
print(a) if __name__ == "__main__":
pool = Pool(5)
for i in range(10):
#apply执行任务是串行的,因为结果是一个一个输出 ,前台线程
# pool.apply(func=f1, args=(i,))
#循环申请10个进程,但进程池最多只有5个,因为会一次性申请5个进程,然后再次申请 (并发),callback设置回调函数,后台线程
pool.apply_async(func=f1, args=(i,), callback=f2)
pool.close()
pool.join()#进程池中的进程执行完才关闭,如果注释,apply_async是不等待子进程执行完毕的。
#
#

Python全栈开发 线程和进程的更多相关文章

  1. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  2. python全栈开发 * 线程队列 线程池 协程 * 180731

    一.线程队列 队列:1.Queue 先进先出 自带锁 数据安全 from queue import Queue from multiprocessing import Queue (IPC队列)2.L ...

  3. python全栈开发 * 线程锁 Thread 模块 其他 * 180730

    一,线程Thread模块1.效率更高(相对于进程) import time from multiprocessing import Process from threading import Thre ...

  4. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  5. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  6. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  7. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  8. 自学Python全栈开发第一次笔记

           我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...

  9. python全栈开发目录

    python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...

随机推荐

  1. 学习css中得与惑

    css的学习分享 所学的css知识看多,会看懂.这只是在实践中发现的问题:  一. ???h1比div还大  h1上下有边距   为什么浮动不了  (现不知道) 二. css写了 表现不出来.... ...

  2. 高级Linux SA需要会做的事情

    高级Linux SA需要会做的事情:linux---------系统安装(光盘或自动化安装)linux---------系统常用工具安装(sudo,ntp,yum,rsync,lrzsz syssta ...

  3. LeetCode-Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  4. iOS初步开发

    趁公司目前iOS整个没人管理,我折腾一下调试工具,刚好nordic也有参考demo. 然后作为helloworld级别的我... 就直接down下来,结果,还不错, 不像oschina.net和cod ...

  5. Struts2 之 对xwork的理解

    对象的生命周期的管理是面向对象编程亘古不变的话题,从syntax的角度,面向对象的高级编程语言都是以“对象”为核心,而对象之间的继承关系.嵌套引用关系构成的对象树结构为我们进行对象级别的逻辑操作提供了 ...

  6. ubuntu 16.04 启用root用户方法

    引用:http://blog.csdn.net/sunxiaoju/article/details/51993091 1.使用:sudo passwd root设置root的密码,如下图所示: 2.使 ...

  7. js控制 固定框架内图片 按比例显示 以及 占满框架 居中显示

    js控制 固定框架内图片 等比例显示 以及 占满框架 纵横居中显示 通过设置 js函数 fitDiv里面var fit的值就好 function fitDiv (obj) { var target_w ...

  8. Python 获得对象内存占用内存大小 sys.getsizeof

    from sys import getsizeof class A(object): pass class B: pass for x in (None, 1, 1L, 1.2, 'c', [], ( ...

  9. 用msbuild构建应用

    msbuild是微软提供的一个用于生成应用程序的平台,你可以通过一个xml配置文件来控制和处理你的软件工程.它也集成到了vs里面,它不依赖于vs. xml配置(架构)的组成元素: 项目文件 属性 项 ...

  10. Python基础篇【第7篇】: 面向对象(1)

    面向对象技术简介 相近对象,归为类 在人类认知中,会根据属性相近把东西归类,并且给类别命名.比如说,鸟类的共同属性是有羽毛,通过产卵生育后代.任何一只特别的鸟都在鸟类的原型基础上的.面向对象就是模拟了 ...