1.线程是程序里面最小的执行单元。

2.进程是资源的集合。

  线程是包含在进程里面的,一个进程可以有多个线程,但只要要有一个线程。

一.多线程,就是N个线程一起干活:

  1.传统方式,串行,循环5次需要15s:

import threading,timedef run():  time.sleep(3)  #干活需要3sprint('哈哈哈')for i in range(5):  #串行run()

  2.使用多线程并发的方式,节省时间:

import threading,timedef run():  time.sleep(3)  #干活需要3sprint('哈哈哈')
for i in range(5):#并发  t = threading.Thread(target=run)  #实例化了一个线程,其中target=执行的函数名t.start()  #启动线程

举例:多线程爬虫,比较下并发和串行的时间:

 串行方式:

import threading,time,requestsurls = {'baidu':'http://www.baidu.com','hao123':'http://www.hao123.com','taobao':'https://www.taobao.com/'
}def down_html(file_name,url):res = requests.get(url).content  #返回二进制内容open(file_name+'.html','wb').write(res)  #因此打开的时候,用wb二进制打开

用串行方式
start_time = time.time()
for k,v in urls.items():down_html(k,v)
end_time = time.time()run_time = end_time - start_time
print('下载总共花了%s的时间'%run_time)

串行结果:

并行方式:这种方式计算的并发时间是不准确的,因为在运行程序时默认先运行主线程,其他线程只是开始运行(下载网页)并不一定结束(而一个进程中的多个线程都是相互独立的。)主线程负责定义函数,启动其他线程等。因此,最终并行运行的结果时间,仅仅是主线程的运行时间。

   主线程默认有个主线程子线程:主线程启动子线程

import threading,time,requestsurls = {'baidu':'http://www.baidu.com','hao123':'http://www.hao123.com','taobao':'https://www.taobao.com/'
}def down_html(file_name,url):res = requests.get(url).content  #返回二进制内容open(file_name+'.html','wb').write(res)  #因此打开的时候,用wb二进制打开#用并行方式
start_time = time.time()
for k,v in urls.items():#因为urls里有3个Key,因此会启动3个线程t = threading.Thread(target=down_html,args=(k,v))  #使用多线程调用参数时,必须用args=xx才能传参
    t.start()
end_time = time.time()
run_time = end_time - start_time
print('下载共花了%s时间'%run_time)

并行结果:

线程等待:.join()-----实现并发

下面程序运行流程:

主线程负责启动5个子线程,把每个线程放在threads list里,然后等待所有线程等待完毕后,再执行end_time = time.time()语句,实现最后计算所有线程都结束的并发时间。

主线程默认有个主线程
子线程:主线程启动子线程

import threading,time
def run():time.sleep(3):print('哈哈哈哈')start_time = time.time()
threads=[]  #存放启动的5个子线程
for i in range(5): t = threading.Thread(target=run) #实例化 t.start() #启动线程 threads.append(t) #启动后将子线程加入列表 for t in threads: #主线程循环等待5个子线程执行结束 t.join() #循环等待,等所有线程执行完毕后,再执行下一句,即实现计算所有并发时间 end_time = time.time() print('run_time',end_time-start_time) 

运行结果:并发时间:(这个时间是准确的)

转载于:https://www.cnblogs.com/fancyl/p/9101193.html

多线程threading初识,线程等待相关推荐

  1. 易语言多线程Api封装线程等待CPU优化

    API-线程等待CPU优化 用到的API 1.MsgWaitForMultipleObjects 2.WaitForSingleObject 3.SetThreadAffinityMask 4.Set ...

  2. 多线程开发之---线程等待

    http://blog.csdn.net/newthinker_wei/article/details/12449269

  3. 再读苹果《Threading Programming Guide》笔记(一):初识线程

    记得第一次读这个文档还是3年前,那时也只是泛读.如今关于iOS多线程的文章层出不穷,但我觉得若想更好的领会各个实践者的文章,应该先仔细读读官方的相关文档,打好基础,定会有更好的效果.文章中有对官方文档 ...

  4. python 线程等待_详解python多线程之间的同步(一)

    引言: 线程之间经常需要协同工作,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直到该线程完成对数据的操作.这些技术包括临界区(Critical Section),互斥量(Mute ...

  5. python守护多线程_Python多线程Threading、子线程与守护线程实例详解

    线程Threading: python中多线程需要使用threading模块 线程的创建与运行: 1.直接调用threading的Thread类: 线程的创建:线程对象=thread.Thread(t ...

  6. Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)

    1.多线程执行带有参数的任务 以元组形式传参 以字典方式进行传参       (字典的key值和参数名要一致) 2.线程的注意点 线程之间执行是无序的 主线程会等待所有的子线程执行结束再结束 如果要主 ...

  7. python多线程threading之阻塞线程(join)线程同步和守护线程(setDaemon(True))实例详解

    一.多线程(主线程和子线程同时执行) 1.主线程是程序本身,看不到的,主线程和子线程没有依赖关系,同步执行的,若主线程先执行完,会等子线程执行完毕,程序结束 2.启动一个线程就是把一个函数传入并创建T ...

  8. 多线程-threading和进程VS线程(python 版)

    多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用 1. 使用threading模块 ...

  9. 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...

最新文章

  1. 单细胞RNA降维之UMAP
  2. 南方电网两栖机器人_探访国内最大5G智能电网应用区:5G机器人已替代人工巡检...
  3. 使用LINQ解除SQL注入安全问题
  4. PyCharm3.0默认快捷键
  5. 【推荐】新冠肺炎的最新数据集和可视化和预测分析(附代码)
  6. firefox BUG --输入法转换时,关闭浏览器. 5555....... 心碎...
  7. 《大道至简》第一章伪代码
  8. OPC Client “failed to execute OPCENUM” 解决方法
  9. C++---汉明距离
  10. 【转载】浅谈 看图软件 的设计与实现
  11. ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defi
  12. centos6.5解决方案-1
  13. 如何在Kubernetes中暴露服务访问 1
  14. a标签实现下载文件功能
  15. css固定图片大小 vue_img设置图片大小 vue_如何改变图片大小
  16. python爬取微信公众号_python爬取微信公众号
  17. 【AUTOSAR-COM】-10.3-接收的IPDU Callout(Com_RxIpduCallout)的使用小结
  18. 进不了字节,腾讯等大厂没学历的程序员应该如何生存?
  19. BOL简单分析(一)
  20. 没及格,我猜这套华为软件测试面试题没几个人能及格

热门文章

  1. Python学习笔记__4.1章 高阶函数
  2. 在Map 3D显示管理器中更改当前地图的名字
  3. mysqli_connect_error 乱码解决
  4. 二、Spark在Windows下的环境搭建
  5. Java动物类enjoy方法打印_Java反射学习-2 - 获取Class对象的三种方式
  6. Redis操作ZSet相关API
  7. MySQL count函数的具体介绍
  8. Nginx静态资源压缩实战内容介绍
  9. 实例化Spring Bean:Bean实例化的姿势有多少种?
  10. Quartz集群部署