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. 团队C++作业1

    我的分工 在本次作业中,我负责的是建筑类的完成还有调试运行. 建筑类的完成: 首先我认为建筑类的完成中,建筑类中应该有三个成员,水晶,防御塔,泉水. 水晶在这个里头是要被保护的对象,它的功能有回血还有 ...

  2. 使用成员资格管理用户Membership

    ASP.NET成员资格使您可以验证和管理Web应用程序的用户信息.它提供验证用户凭据,创建和修改成员资格用户以及管理用户设置(如密码和电子邮件地址)的功能. ASP.NET成员资格主要用于ASP.NE ...

  3. eg_7

    1. 给定Map,根据Map中的值从大到小排列 package com.studentmanager.www; import java.util.ArrayList; import java.util ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14

    1.当天站立式会议照片 本次会议在5号公寓1楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据老师的要求将项目划分成一系列小任务.③:选择项目的开发模式:jsp+servlet+javabean ...

  5. ASP.NET MVC 2.0 参考源码索引

    http://www.projky.com/asp.netmvc/2.0/System/Web/Mvc/AcceptVerbsAttribute.cs.htmlhttp://www.projky.co ...

  6. Beta阶段DAY1

    一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:了解了自己再beta阶段的安排,但因为考试,有心无力. 林庭亦:颜色设置的相关代码的查看. 郑子熙:和另一位组 ...

  7. GDI+缩放图片

    uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var  Bitmap1: TGPBitmap;  Bitmap2: TBitmap;  Graphic: TGPGraphi ...

  8. [转帖]学习一下centos7 新地方

    总结的挺好  copy一下 慢慢学习: http://blog.itpub.net/312079/viewspace-2214440/ Centos7 单用户模式 centos7里不再有0-6启动级别 ...

  9. 微信小程序组件 日历

    js文件 'use strict'; let choose_year = null,   choose_month = null; const conf = {   data: {     hasEm ...

  10. Angular js Radio Button

    症状: 绑定一个list   radio button 老是只能绑定一行,纠结了很久 ,回家发现  原来是 name 用了同一个  ,坑啊,记录下 免得下次再犯. 之前的代码 <ul> & ...