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

2.进程是资源的集合。

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

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

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

import threading,time

def run():
  time.sleep(3) #干活需要3s
print('哈哈哈') for i in range(5): #串行
run()

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

import threading,time

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

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

 串行方式:

import threading,time,requests

urls = {
'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,requests

urls = {
'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)

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

最新文章

  1. CentOS配置git和maven自动部署java
  2. MySQL存储引擎选型
  3. [moka学习笔记]yii2.0数据库查询的多种方法(未完待整理)
  4. JQuery Delay Hover效果
  5. 反射认识_02_反射成员变量Field
  6. [转载] 分析Linux内核创建一个新进程的过程
  7. dbcp基本配置和重连配置 -- mysql 8小时自动断开连接的问题
  8. IntelliJ IDEA 13.x 下使用Hibernate + Spring MVC + JBoss 7.1.1
  9. 给枚举加上Description,必要时,可以直接获取枚举类型代表的中文
  10. ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
  11. 服务消费者Feign和Ribbon的区别
  12. OO第四次作业总结
  13. [EXP]Microsoft Windows - DfMarshal Unsafe Unmarshaling Privilege Escalation
  14. asp.net 使用一般处理程序和ajax post实现登录以及记住密码
  15. javaSE——File文件的操作
  16. mysql-10临时表、复制表
  17. dokcer 的export 、improt和save 、load
  18. python学习之老男孩python全栈第九期_day018知识点总结——正则表达式、re模块
  19. 创建并运行第一个Django项目
  20. 【前缀和】【枚举倍数】 Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) D. Arpa and a list of numbers

热门文章

  1. Chrome开发者工具详解(三)之浏览器调试完后如何清除所有的断点
  2. SpringMVC_放行静态资源
  3. HTML-图片和多媒体
  4. fpga ip
  5. 事件,IO,select
  6. Linux包安装及搭建服务
  7. 长短时间记忆的中文分词 (LSTM for Chinese Word Segmentation)
  8. Python核心技术与实战——九|面向对象
  9. php内置函数分析之array_sum()
  10. 控制DIV内容滚动的方法,实现不用拖滚动条就可以看到最新消息