import time,threading

print("=======串行方式、并行两种方式调用run()函数=======")
def run():
print('哈哈哈') #串行
for i in range(5):
run() #并行
for i in range(5):
t = threading.Thread(target=run) #实例化了一个线程
t.start() print("======串行、并行方式统计网页下载时间=======") import requests
#定义函数,用于发送http请求,获取网页的内容并写入文件
data= {}
def down_html(file_name,url):
start_time = time.time()
res = requests.get(url).content
open(file_name+'.html','wb').write(res)
end_time = time.time()
run_time = end_time-start_time
data[url] = run_time #定义一个字典,存放要请求的url地址
urls = {
'besttest':'http://www.besttest.cn',
'niuniu':'http://www.nnzhp.cn',
'dsx':'http://www.imdsx.cn',
'cc':'http://www.cc-na.cn'
} #串行方式下载网页
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('串行方式下载总共花时间:',run_time) #并行方式下载网页
threads = []
start_time = time.time()
for k,v in urls.items(): #开启5个子线程,加上进程中有一个默认的主线程,一共是6个线程
t = threading.Thread(target=down_html,args=(k,v)) #多线程的函数如果传参的话,必须得用args
t.start()
threads.append(t) for t in threads:
#1、主线程等待5个子线程执行完毕,主线程接着运行主线程剩余余部分的代码,
#2、不加上下面这行代码,则统计的子线程下载时间不对,下载时间取花费时间最长的那个子线程
#3、如果子线程已经运行完毕,调用下方join()方法也不会报错
t.join() end_time = time.time()
run_time = end_time - start_time
print('并行方式下载总共花时间:',run_time)
print('并行方式各个网页下载花时间:',data) print("=========守护线程=========")
def cry():
time.sleep(3)
print('哇哇哇.......') for i in range(3):
t = threading.Thread(target=cry)
#1、守护线程:只要主线程结束,那么子线程立即结束,不管子线程有没有运行完成。
#2、setDaemon(True)方法把子线程设置成为守护线程
#3、如何避免由于主线程代码运行完毕,而导致子线程被迫也结束运行的问题:在主线程代码部分time.sleep(3),sleep的时间大于3更好
#4、去掉主线程部分的time.sleep(3)代码,如果主线程运行的比子线程快,则会导致子线程运行过程中突然中断
t.setDaemon(True)
t.start() print('Done,运行完成。')
time.sleep(3) print("========线程锁==========")
#线程为什么要加锁:多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱
#在python2里面需要程序员手动加锁,python3里面不加锁也无所谓,默认会自动帮你加锁。 num = 1
lock = threading.Lock() #申请一把锁
def update():
time.sleep(1)
global num
lock.acquire() #加锁
num+=1
lock.release() #解锁
ts = []
for i in range(3):
t = threading.Thread(target=update)
t.start()
ts.append(t)
[t.join() for t in ts]
print('多线程修改全局变量,修改后的值为:',num) print("==========多进程=========")
import multiprocessing,threading
def output():
print('呵呵呵哈哈哈嘿嘿嘿') def execute(num):
for i in range(num):
t = threading.Thread(target=output)
t.start()
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=execute,args=(2,)) #启动5个进程,6个线程
p.start() # 问题:为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快
# 原因:因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁。
# 如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval
# 来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处于等待状态
# 1、如果是CPU密集型代码(循环、计算等),由于计算工作量多和大,计算很快就会达到100,然后触发GIL的释放与在竞争,多个线程来回切换损耗资源,
# 所以在多线程遇到CPU密集型代码时,单线程会比较快
# 2、如果是I\O密集型代码(文件处理、网络爬虫),开启多线程实际上是并发(不是并行),IO操作会进行IO等待,线程A等待时,自动切换到线程B,
# 这样就提升了效率

Python【多线程与多进程】的更多相关文章

  1. Python多线程和多进程谁更快?

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...

  2. python多线程与多进程--存活主机ping扫描以及爬取股票价格

    python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...

  3. Python 多线程、多进程 (三)之 线程进程对比、多进程

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...

  4. Python 多线程、多进程 (一)之 源码执行流程、GIL

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  5. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  6. python多线程与多进程及其区别

    个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...

  7. 基于Windows平台的Python多线程及多进程学习小结

    python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具 ...

  8. python 多线程、多进程

    一.首先说下多线程.多进程用途及异同点,另外还涉及到队列的,memcache.redis的操作等: 1.在python中,如果一个程序是IO密集的操作,使用多线程:运算密集的操作使用多进程. 但是,其 ...

  9. python多线程,多进程

    线程是公用内存,进程内存相互独立 python多线程只能是一个cpu,java可以将多个线程平均分配到其他cpu上 以核为单位,所以GIL(全局锁,保证线程安全,数据被安全读取)最小只能控制一个核,很 ...

  10. 搞定python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

随机推荐

  1. Linux下oracle启动/关闭监听(bash:lsnrctl:command not found)

    打开终端 切换帐户 # su - Oracle 启动监听 $ lsnrctl start 关闭监听 $ lsnrctl stop 切换帐户一定要加 "-" 否则会出现:   bas ...

  2. “Hello World!”团队第六周第七次会议

    博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout&push代码 一.会议时间 2017年11月23日  ...

  3. 团队项目-NABCD

    用户需求分析与NABCD 模拟经营类(SIM)游戏:玩家模拟经营一家软件公司,平台初步定为Android. Need需求 任何一款游戏都要有自己的定位和目标群体,这些 iiMediaResearch数 ...

  4. 项目冲刺Beta第二篇博客

    Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060  排行榜界面美化 陈敬轩059  注册成功界面美化 黄兴067  登录界面美化 林国梽068  答题界 ...

  5. redux相关专业名词及函数提要

    redux: 用来管理react app 状态(state)的一个架构. store: 通过createStore()创建,用来存放state,与react app是完全分离的.createStore ...

  6. 讲讲Windows10(UWP)下的Binding

    前言 貌似最近来问我XAML这块的东西的人挺多的.有时候看他们写XAML这块觉着也挺吃力的,所谓基础不牢,地动山摇.XAML这块虽说和HTML一样属于标记语言,但是世界观相对更加庞大一点. 今天讲讲X ...

  7. 用css 修改 谷歌浏览器自带的 滚动条样式

    ::-webkit-scrollbar { width: 0.5rem;}/* Track */ ::-webkit-scrollbar-track { -webkit-box-shadow: ins ...

  8. [2017BUAA软工]个人项目心得体会:数独

    心得体会 回顾此次个人项目,感受比较复杂,最明显的一点是--累!代码编写.单元测试.代码覆盖.性能优化,环环相扣,有种从作业发布开始就一直在赶DDL的感觉,但是很充实,也学习到和体验了很多东西.最令人 ...

  9. python基础(五)函数

    一.函数概念 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal ...

  10. Linux中Apache+Tomcat+JK实现负载均衡和群集的完整过程

    人原创,一个字一个字地码的,尊重版权,转载请注明出处! http://blog.csdn.net/chaijunkun/article/details/6987443 最近在开发的项目需要承受很高的并 ...