python学习笔记(二十七)多线程与多进程
线程是程序里面的最小执行单元。
进程是资源的集合。
线程是包含在一个进程里面,一个进程可以有多个线程,一个进程里面默认有一个主线程。由主线程去启动子线程。
1.多线程
import threading,time
def run():
time.sleep() #干活需要3s
print('哈哈哈')
#########################################
for i in range(): #串行
run()
#########################################
for i in range(): #并行,多线程, 就是N个线程一起在干活
t = threading.Thread(target=run) #实例化了一个线程
t.start()
#########################################
2.多线程等待
举个栗子:我们定义一个urls字典,然后用并行和串行分别扒一下这些url上的内容,并统计时间。
urls = {
'besttest':'http://www.besttest.cn',
'niuniu':'http://www.nnzhp.cn',
'dsx':'http://www.imdsx.cn',
'cc':'http://www.cc-na.cn',
'alin':'http://limlhome.cn'
}
需要定义一个扒网页内容的函数,如果后面需要统计每个子线程的耗时,那么就需要在这个函数中定义start_time和end_time,函数如下:
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
所有的代码如下:
import requests,time,threading
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
threads = []
start_time = time.time()
for k,v in urls.items(): #5次
t = threading.Thread(target=down_html,args=(k,v)) #多线程的函数如果传参的话,必须得用args
t.start()
threads.append(t)
#6个线程
#进程里面默认有一个线程,这个线程叫做主线程
for t in threads:
t.join() #多线程等待,主线程循环等待5个子线程执行结束 end_time = time.time()
run_time = end_time - start_time
print(data)
print('下载总共花了xxx时间',run_time)
3.守护线程
import threading,time
def run():
time.sleep()
print('哈哈哈')
for i in range():
t = threading.Thread(target=run)
t.setDaemon(True) #把子线程设置成为守护线程
t.start()
print('Done,运行完成。')
#当主线程运行完成后就立即结束子线程。所以运行结果只输出了“Done,运行完成”。子线程并没有来得及打印“哈哈哈”就被结束了。
4.线程锁
import threading,time
num =
lock = threading.Lock() #申请一把锁 def run():
time.sleep()
global num
lock.acquire() #加锁
num+=
lock.release() #解锁
ts = []
for i in range():
t = threading.Thread(target=run)
t.start()
ts.append(t)
[t.join() for t in ts] #列表生成式,多线程等待
print(num)
5.多进程和多进程等待
import multiprocessing,threading
def my():
print('哈哈哈') def run(num):
for i in range(num): #启动num个线程
t = threading.Thread(target=my)
t.start()
if __name__ == '__main__':
for i in range(): #启动5个进程
p = multiprocessing.Process(target=run,args=(,)) #启动一个进程,如果参数只有一个,那么参数后面一定要加一个逗号
p.start() # 进程5个
# 每个进程下启动6个线程
#进程等待也可以用pjoin()
总结:
1、如果子线程运行的函数里面有返回值该怎么处理?
如果子线程运行的函数里面有返回值,是不能获取到的,只能在外面定义一个list或字典来存放每次处理的结果。
2、电脑有几核就能同时运行几个线程。但是,python的多线程只能利用一个CPU的核心。
3、锁,在多线程同时修改一个数据或文件的时候,可能会把数据覆盖,在python2里面需要加锁,python3里面不加锁也无所谓,默认会自动帮你加锁。
4.守护线程,只要主线程结束,那么子线程立即结束,不管子线程有没有运行完成。
5、多进行,多用于处理CPU密集型任务;多线程,多用于IO密集型任务。
python学习笔记(二十七)多线程与多进程的更多相关文章
- python学习笔记(二)、字符串操作
该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
- (10.1)Python学习笔记二
1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...
- Java基础学习笔记二十一 多线程
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- Python学习之路14☞多线程与多进程
一 进程与线程的概念 1.1 进程 进程定义: 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数 ...
- python学习之路-11 多线程、多进程、协程
python内置队列模块 queue queue的四种队列 q = queue.Queue() # 先进先出队列 q = queue.LifoQueue() # 后进先出队列 q = queue.Pr ...
- python学习笔记(threading多线程)
博主昨天优化了接口框架想着再添加些功能 想到对接口的性能压力测试 在工作过程中之前都是使用的工具 如:loadrunner.jmeter 想着这次准备用python实现对接口的性能压力测试 首先要实现 ...
- Python学习笔记整理(十七)异常处理
一.异常基础 try/except:捕捉由代码中的异常并恢复,匹配except里面的错误,并自行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常后,不会中断程序,继续执行 ...
- Python学习笔记二
---恢复内容开始--- 一. python几种数据类型的比较. 从以下几个方面比较: 1. 是否可变. 不可变类型:变量的值可以发生变化,id也变了,相当于创建了一个新的对象,所以一修改值,id就变 ...
- Python学习(二十七)—— Django和pymysql搭建学员管理系统
转载自http://www.cnblogs.com/liwenzhou/p/8270250.html 一.学员管理系统 1.项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的e ...
随机推荐
- HTML5关于上传API的一些使用(中)
上一次写了关于HTML的上传API,XMLHttpRequest2.0的上传方式,以及HTML5中上传之前本地的预览,包括对于图片以及部分信息的预 览.这次我们就讲下HTML5中关于上传的一些各种个性 ...
- js函数与 Promise的使用
JavaScript的函数不但是“头等公民”,而且可以像变量一样使用,具有非常强大的抽象能力. 定义函数的方式如下: function abs(x) { if (x >= 0) { return ...
- JAVA中有一个特殊的类: Object
JAVA中有一个特殊的类: Object.它是JAVA体系中所有类的父类(直接父类或者间接父类). 此类中的方法可以使所的类均继承. 以下介绍的三种方法属于Object: (1) finalize方法 ...
- gsoap 学习 1-自己定义接口生成头文件
接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序中头文件定义和通过wsdl生成的头文件的内容,可以发现,头文件中都会出现以下几行信息 //gsoap ns service ...
- mathtype免费版下载及序列号获取地址
在编辑公式这个方面来说,MathType是使用最多的一个工具,因为它操作简单,不需要复杂的学习过程就可以很快地掌握操作技巧,并且功能也比Office自带的公式编辑器完善很多,可以对公式进行批量修改.编 ...
- hdu 1560(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 思路:关键是启发式函数h()的构造,我们可以这样想:每次给主串增加一个字符和字符串的最后一位比较 ...
- Laravel5.1 搭建博客 --上传文件及文件管理
教程源自:Laravel学院 这一节 咱来说说上传文件的功能实现,我们会把上传的文件保存到项目本地,不仅上传 还有删除和预览功能. 1 配置 我们先从配置开始做起,先修改我们自己创建的 blog.ph ...
- lumen 常用辅助函数
optional 函数接收任意参数并允许你访问对象上的属性或调用其方法.如果给定的对象为空,属性或方法调用返回 null return optional($user->address)-> ...
- WPF 单实例应用程序
例如:Microsoft Word,不管打开多少个文档(也不管它们是如何打开的),一次只能加载 winword.exe 一个实例. 这便是单实例应用程序. 对于这种单实例应用程序,WPF 本身并未提供 ...
- Eclipse导入MyEclipseproject(web项目显示为java项目解决的方法)
在直接Import MyEclipse的项目文件导入到Eclipse之后,须要在项目所放的workspace内改动引入项目文件夹下的.project文件,改动例如以下: 1.在eclipse中新建一个 ...