Python 多线程Threading初学教程


Posted in Python onAugust 22, 2017

1.1 什么是多线程 Threading

多线程可简单理解为同时执行多个任务。

多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦。

1.2 添加线程 Thread

导入模块

import threading

获取已激活的线程数

threading.active_count()

查看所有线程信息

threading.enumerate()

查看现在正在运行的线程

threading.current_thread()

添加线程,threading.Thread()接收参数target代表这个线程要完成的任务,需自行定义

def thread_job():
  print('This is a thread of %s' % threading.current_thread())
def main():
  thread = threading.Thread(target=thread_job,)  # 定义线程 
  thread.start() # 让线程开始工作
  if __name__ == '__main__':
  main()

1.3 join 功能

因为线程是同时进行的,使用join功能可让线程完成后再进行下一步操作,即阻塞调用线程,直到队列中的所有任务被处理掉。

import threading
import time
def thread_job():
  print('T1 start\n')
  for i in range(10):
    time.sleep(0.1)
  print('T1 finish\n')
def T2_job():
  print('T2 start\n')
  print('T2 finish\n')
def main():
  added_thread=threading.Thread(target=thread_job,name='T1')
  thread2=threading.Thread(target=T2_job,name='T2')
  added_thread.start()
  #added_thread.join()
  thread2.start()
  #thread2.join()
  print('all done\n')
if __name__=='__main__':
   main()

例子如上所示,当不使用join功能的时候,结果如下图所示:

Python 多线程Threading初学教程

当执行了join功能之后,T1运行完之后才运行T2,之后再运行print(‘all done')

Python 多线程Threading初学教程

1.4 储存进程结果 queue

 queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

 (1)基本FIFO队列

class queue.Queue(maxsize=0)

maxsize是整数,表明队列中能存放的数据个数的上限,达到上限时,插入会导致阻塞,直至队列中的数据被消费掉,如果maxsize小于或者等于0,队列大小没有限制

(2)LIFO队列 last in first out后进先出

class queue.LifoQueue(maxsize=0)

(3)优先级队列

class queue.PriorityQueue(maxsize=0)

视频中的代码,看的还不是特别明白

import threading
import time
from queue import Queue
def job(l,q):
  for i in range(len(l)):
    l[i]=l[i]**2
  q.put(l)
def multithreading():
  q=Queue()
  threads=[]
  data=[[1,2,3],[3,4,5],[4,5,6],[5,6,7]]
  for i in range(4):
    t=threading.Thread(target=job,args=(data[i],q))
    t.start()
    threads.append(t)
  for thread in threads:
    thread.join()
  results=[]
  for _ in range(4):
    results.append(q.get())
  print(results)
if __name__=='__main__':
   multithreading()

运行结果如下所示

Python 多线程Threading初学教程Python 多线程Threading初学教程

图片截取来源:http://www.cnblogs.com/itogo/p/5635629.html

1.5 GIL 不一定有效率

Global Interpreter Lock全局解释器锁,python的执行由python虚拟机(也成解释器主循环)控制,GIL的控制对python虚拟机的访问,保证在任意时刻,只有一个线程在解释器中运行。在多线程环境中能,python虚拟机按照以下方式执行:

1.设置 GIL

2.切换到一个线程去运行

3.运行:

a.指定数量的字节码指令,或

b.线程主动让出控制(可以调用time.sleep(0))

4.把线程设置为睡眠状态

5.解锁GIL

6.重复1-5

在调用外部代码(如C/C++扩展函数)的时候,GIL将会被锁定,直到这个函数结束为止(由于在这期间没有python的字节码被运行,所以不会做线程切换)。

下面为视频中所举例的代码,将一个数扩大4倍,分为正常方式、以及分配给4个线程去做,发现耗时其实并没有相差太多量级。

import threading
from queue import Queue
import copy
import time
def job(l, q):
  res = sum(l)
  q.put(res)
def multithreading(l):
  q = Queue()
  threads = []
  for i in range(4):
    t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
    t.start()
    threads.append(t)
  [t.join() for t in threads]
  total = 0
  for _ in range(4):
    total += q.get()
  print(total)
def normal(l):
  total = sum(l)
  print(total)
if __name__ == '__main__':
  l = list(range(1000000))
  s_t = time.time()
  normal(l*4)
  print('normal: ',time.time()-s_t)
  s_t = time.time()
  multithreading(l)
  print('multithreading: ', time.time()-s_t)

运行结果为:

Python 多线程Threading初学教程

Python 多线程Threading初学教程

1.6 线程锁 Lock

如果线程1得到了结果,想要让线程2继续使用1的结果进行处理,则需要对1lock,等到1执行完,再开始执行线程2。一般来说对share memory即对共享内存进行加工处理时会用到lock。

import threading
def job1():
  global A, lock #全局变量
  lock.acquire() #开始lock
  for i in range(10):
    A += 1
    print('job1', A)
  lock.release() #释放
def job2(): 
  global A, lock
  lock.acquire()
  for i in range(10):
    A += 10
    print('job2', A)
  lock.release()
if __name__ == '__main__':
  lock = threading.Lock()
  A = 0
  t1 = threading.Thread(target=job1)
  t2 = threading.Thread(target=job2)
  t1.start()
  t2.start()
  t1.join()
  t2.join()

运行结果如下所示:

Python 多线程Threading初学教程

总结

以上所述是小编给大家介绍的Python 多线程Threading初学教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现快速多线程ping的方法
Jul 15 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Python中random模块生成随机数详解
Mar 10 Python
利用Python开发微信支付的注意事项
Aug 19 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
python and or用法详解
Jun 26 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
PyQt5实现简单的计算器
May 30 Python
Selenium 安装和简单使用的实现
Dec 04 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 #Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 #Python
Python实现的矩阵类实例
Aug 22 #Python
Python实现图片转字符画的示例
Aug 22 #Python
利用aardio给python编写图形界面
Aug 21 #Python
Python实现图片转字符画的示例代码
Aug 21 #Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 #Python
You might like
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
php 基础函数
2017/02/10 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
js function定义函数使用心得
2010/04/15 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python读写csv文件方法详细总结
2019/07/05 Python
Python流程控制 if else实现解析
2019/09/02 Python
python3 字符串知识点学习笔记
2020/02/08 Python
Python短信轰炸的代码
2020/03/25 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
自动化专业个人求职信范文
2013/12/30 职场文书
代领毕业证委托书
2014/08/02 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python