单线程

import time

beginTime = time.time()
for a in range(10):
print(a)
time.sleep(1)
shijian = time.time() - beginTime
print(shijian) #10.000571966171265

  我们可以看到,上面这段代码就是纯正的单线程,一条道走到黑,讲究先后,所以花了10秒多

多线程

  毕竟等待是让人心烦的,有什么方法能不这么耗时间啊,有啊,主角登场,欢迎多线程,那多线程做了一件什么事呢?它可以同时做多件事,就拿上面例子,在这个线程睡觉时,它会去执行其他的线程。

import threading
import time def printNum(a):
time.sleep(1)
print(a) beginTime = time.time()
for i in range(10):
t = threading.Thread(target=printNum,args=(i,))
t.start() # for i in range(10):
# t.join()
shijian = time.time() - beginTime
print(shijian) 结果为:
0.0010001659393310547
2
1
0
4
6
9
3
5
7
8

  看到这,你可能会想,输出的结果怎么是无序的,就是因为多线程是每个线程各自去执行自己的,所以就有可能存在抢占输出资源的情况。

  你可能又会想,怎么只要0.001秒就完成了,太不符合逻辑了,那我告诉你,这个时间为主线程的执行时间,如果要知道所有的线程执行时间,只要解注释t.join()这两句代码就可以了,结果一般为1秒多点点。

过程详解

#引入线程模块threading
import threading
import time #定义线程中的执行方法
def printNum(a):
print('num:',a)
time.sleep(1) def printStr(str1,str2):
print(str1,':',str2)
time.sleep(1) #初始化一个线程对象
t_0 = threading.Thread(target=printNum,args=(888,))
#启动线程
t_0.start() #target指定需要执行的函数名,args指定元组形式的参数
t_1 = threading.Thread(target=printStr,args=('this is the arg','string'))
t_1.start() #一次创建10个线程对象并启动
for i in range(10):
t = threading.Thread(target=printNum,args=(i,))
t.start()

threading模块详解

  Python的线程中没有优先级、线程组,也不能被停止、暂停、恢复、中断,线程只能随着线程中的代码执行完毕而被销毁、

  threading模块提供的类

  --Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local

  threading模块里的常用方法

  1. threading.currentThread()  返回当前的线程变量
  2. threading.enumerate()    返回一个包含正在运行的线程的list,正在运行指线程启动后、结束后,不包括启动前和终止后的线程
  3. threading.activeCount()  返回正在运行的线程数量,与len(threading.enumerate())相同结果

join的高级用法

import time
import threading def printNum(a):
print('num:',a)
time.sleep(1) def ThreadTest():
return threading.Thread(target=printNum,args=(999,)) thread_li = []
for i in range(10):
t = ThreadTest()
thread_li.append(t) for t in thread_li:
t.start() for t in thread_li:
t.join() print('finished')

  我们从上面的代码可以看出,join方法不再像以前一样让线程一个一个排队执行了,所有的线程并发执行完后,才会执行主线程最后的代码!

Lock类和Rloc类

  锁住资源,让线程一个一个来操作

  • acquire  给线程上锁
  • release  给线程解锁
import threading

lock = threading.Lock()  #创建锁对象
lock.acquire()
lock.acquire() #生成死锁,阻塞
lock.release()
lock.release()

  Lock上锁与解锁两个方法只能一前一后出现,否则很容易出现死锁

import threading

Rlock = threading.RLock()  #创建锁对象
Rlock.acquire()
Rlock.acquire() #没有阻塞
Rlock.release()
Rlock.release()

  而Rlock就比较随意,只要上锁和解锁两个方法成双出现就可以了

更多详细内容请见:http://www.cnblogs.com/xinsiwei18/p/5697802.html

                              欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生

python基础-第九篇-9.2线程与多线程的更多相关文章

  1. python基础-第九篇-9.3线程池

    简单版 import queue import threading class ThreadPool(object): def __init__(self, max_num=20): self.que ...

  2. python基础-第九篇-9.1初了解Python线程、进程、协程

    了解相关概念之前,我们先来看一张图 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作时候,创造并发操作 缺点:抢占资源 通过 ...

  3. Python 基础学习篇

    注:技术尚浅,时间匆忙,如有错误或者不当之处值得商榷的,请留言,吾必思而改之. 第一篇 :Python基础- 安装/变量/输入/及循环语句使用 第二篇:  Python基础- 常用数据类型 第三篇: ...

  4. java并发编程JUC第九篇:CountDownLatch线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  5. 【python自动化第九篇:进程,线程,协程】

    简要: paramiko模块 进程与线程 python GIL全局解释器锁 一.PARAMIKO模块 实现远程ssh执行命令 #!/usr/bin/env python # -*- coding:ut ...

  6. python【第九篇】多线程、多进程

    内容提要 paramiko模块 进程.与线程区别 python GIL全局解释器锁 多线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...

  7. [Python笔记]第九篇:re正则表达式

    一.正则表达式基础 1.正则表达式介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分 ...

  8. python基础-第二篇-基本数据类型

    一.运算符 1.算数运算: 算数运算符相信大家都不陌生吧,尤其是加减乘除,好!那我就带着大家看看最后三个,这三个到底是干什么玩意的? %,取两数相除的余数,看图: **,x的多少次幂,看图: //,取 ...

  9. Python 基础总结篇

    变量及数据类型 Numbers数字分为:int整型,long长整型,float浮点型,complex复数 String字符串由数字.字母.下划线组成的一串字符,用于表示文本的数据类型 bool布尔型: ...

随机推荐

  1. android中Invalidate和postInvalidate的差别

    Android中实现view的更新有两组方法,一组是invalidate.还有一组是postInvalidate.当中前者是在UI线 程自身中使用,而后者在非UI线程中使用. Android提供了In ...

  2. ARM指令中的函数调用

    1. 重要寄存器 SP 栈指针,  每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来 ...

  3. HTML5+CSS3学习笔记(一) 概述

    HTML5+CSS3概述      HTML5和CSS3不仅仅是两项新的Web技术标准,更代表了下一代HTML和CSS技术.虽然HTML5的标准规范还没有正式发布,但是未来的发展前景已经可以预见,那就 ...

  4. MongoDB启动及用户名密码设置

    1.服务启动 下载后的安装步骤,请参见mongoDB安装详细教程 启动服务NET START MongoDB 关闭服务NET STOP MongoDB 启动客户端mongo MongoDB shell ...

  5. SpringCloud系列三:将微服务注册到Eureka Server上

    1. 回顾 通过上篇博客的讲解,我们知道硬编码提供者地址的方式有不少问题.要想解决这些问题,服务消费者需要一个强大的服务发现机制,服务消费者使用这种机制获取服务提供者的网络信息.不仅如此,即使服务提供 ...

  6. Hadoop-2.6.0上调用C的API实现相似云盘的功能

    Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传.下载.删除,重命名) 測试系统:CentOS6.6, hadoop-2.6.0 本次測试是调用hadoop下的C的API来訪问HDFS ...

  7. CAN协议学习(一)协议介绍

    一.简介 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议. 在当前的汽车产业中,出于对安全性.舒适性.方便性.低公害.低成 ...

  8. [译]GLUT教程 - 键盘

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Keyboard GLUT可以让应用程序自动监测键盘输入,包括普通按键和 ...

  9. mybatis 单一参数时的动态语句

    public void getBookList(String publisher,String author){ Map<String,Object> maps = new HashMap ...

  10. 《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser

    本章节告诉我们怎么用搜索.通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了本章节,需要掌握如下几个主要API1.IndexSearcher类:搜索索引的门户,发起者. ...