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

进程是资源的集合。

线程是包含在一个进程里面,一个进程可以有多个线程,一个进程里面默认有一个主线程。由主线程去启动子线程。

1.多线程

import threading,time
def run():time.sleep(3) #干活需要3sprint('哈哈哈')
#########################################
for i in range(5): #串行run()
#########################################
for i in range(5):  #并行,多线程, 就是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).contentopen(file_name+'.html','wb').write(res)end_time = time.time()run_time = end_time-start_timedata[url] = run_time

所有的代码如下:

import requests,time,threading
data= {}
def down_html(file_name,url):start_time = time.time()res = requests.get(url).contentopen(file_name+'.html','wb').write(res)end_time = time.time()run_time = end_time-start_timedata[url] = run_time
threads = []
start_time = time.time()
for k,v in  urls.items():   #5次t = threading.Thread(target=down_html,args=(k,v)) #多线程的函数如果传参的话,必须得用argst.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(3)print('哈哈哈')for i in range(50):t = threading.Thread(target=run)t.setDaemon(True) #把子线程设置成为守护线程t.start()
print('Done,运行完成。')
#当主线程运行完成后就立即结束子线程。所以运行结果只输出了“Done,运行完成”。子线程并没有来得及打印“哈哈哈”就被结束了。

4.线程锁

import threading,time
num = 1
lock = threading.Lock()  #申请一把锁def run():time.sleep(1)global numlock.acquire() #加锁num+=1lock.release() #解锁
ts = []
for i in range(100):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):   #启动5个进程p = multiprocessing.Process(target=run,args=(6,))  #启动一个进程,如果参数只有一个,那么参数后面一定要加一个逗号p.start()# 进程5个# 每个进程下启动6个线程
#进程等待也可以用pjoin()

总结:

1、如果子线程运行的函数里面有返回值该怎么处理?

如果子线程运行的函数里面有返回值,是不能获取到的,只能在外面定义一个list或字典来存放每次处理的结果。

2、电脑有几核就能同时运行几个线程。但是,python的多线程只能利用一个CPU的核心。

3、锁,在多线程同时修改一个数据或文件的时候,可能会把数据覆盖,在python2里面需要加锁,python3里面不加锁也无所谓,默认会自动帮你加锁。

4.守护线程,只要主线程结束,那么子线程立即结束,不管子线程有没有运行完成。

5、多进行,多用于处理CPU密集型任务;多线程,多用于IO密集型任务。

转载于:https://www.cnblogs.com/mululu/p/9118411.html

python学习笔记(二十七)多线程与多进程相关推荐

  1. python学习笔记(二十七) -- 常用内建模块(二) Base64、MD5、SHA1、hmac

    目录 base64 hashlib MD5 SHA1 hmac base64 原理 base64就是对二进制数据进行编码,比如我有6字节的二进制数据,然后每3个字节分为一组,也就是一组有3*8 = 2 ...

  2. 从滚动条到画布的几个代码文件——Python学习笔记之十七

    从滚动条到画布的几个代码文件--Python学习笔记之十七 这一章的继续学习,比在前的照片涉及代码要轻松一些,代码打完后的预期结果总能实现.特别让人欣慰的一点,文本上的文字理解好像上了一个台阶,不用多 ...

  3. python学习笔记(二) 基本运算

    python学习笔记(二) 基本运算 1. 条件运算 基本语法 if condition1: do somethings1elif condition2: do somethings2else: do ...

  4. uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善

    uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 cart.vue <template><view> ...

  5. Mr.J-- jQuery学习笔记(二十七)--DOM操作方法(删除获取文本)

    清除 <body> <button>调用remove</button> <div>我是div<p>我是段落</p> </d ...

  6. python学习笔记二

    1 正则 1-1 普通字符 s1 = 'asd25454655js6565askJ\nNKJLasd5165123' # 1 匹配单个大写英文字母 obj = re.compile('[A-Z]') ...

  7. Python学习笔记(十七)——Pandas库

    数组只能存储一种类型的数据, 同时, 数组提供了许多方便统计计算的功能 (如平均值 mean .标准差 std 等) pandas与numpy的区别 pandas 是基于 numpy 数组构的, 但 ...

  8. (10.1)Python学习笔记二

    1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...

  9. python学习笔记(二十三) -- 多进程和多线程

    目录 多线程多进程的意义 多进程的使用 方式一(fork):  只能在Unix/Linux/Mac系统下执行,windows不可以 方式二(multiprocessing.Process): 全平台通 ...

  10. python学习笔记第十七天------------MySQL数据库

    文章目录 1. 数据库简介 1.1 RDBMS 1.2 SQL 1.3 MySQL 简介 2. 数据完整性 3. 数据库的指令 4. 数据表的指令 5. 增删改查(curd) 6. 数据库设计 7. ...

最新文章

  1. linux远程登录x11,windows linux 通过SSH X11Forwrding 使用图形化界面
  2. Android SQLite数据库的详细使用
  3. [Android工具]更新安卓百度云盘百度网盘资源搜索工具,安卓网盘搜索软件
  4. Python自动化开发学习22-Django下(Form)
  5. SAP UI5 初学者教程之七 - JSON 模型初探试读版
  6. 【Hitachi2020C】ThREE【构造】【二分图染色】
  7. Linux内核中流量控制(4)
  8. Python笔记(6) 数字
  9. 通过as写一个简单的按键_自己写一个简单的二维魔方游戏
  10. undefined reference问题总结
  11. torch.cat;Pytorch nn.MaxPool1d
  12. java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)
  13. Ubuntu下录制gif动图
  14. python实部和虚部_Python复数表示表示和计算
  15. 【Coding】Latex添加表格注释footnote
  16. 斐讯路由器虚拟服务器怎么设置,斐讯PSG1218路由器如何设置
  17. vue简单实现多功能弹幕(比上一个好)
  18. LifeCycle 的使用和原理
  19. 二、SonarQube自定义规则
  20. 【记一次kafka启动报org.apache.zookeeper.KeeperException$NoAuthException:=Noauth for/consumers】

热门文章

  1. linux限制ip带宽,apache如何限制并发数 IP 带宽?
  2. IIS优化-解决IIS访问速度慢问题
  3. webplayer 设置加载图标和屏蔽右键
  4. java地铁最短,地铁最短路径
  5. 簡單設定 kernel 選項在使用 iptables 前
  6. springboot中关于springMvc默认配置,配置扩展,全面接管
  7. 将一个字段的多个记录值合在一行
  8. 基于JDBC从数据库中读取数据,在百度地图批量标注地点
  9. asio::io_service被废弃的问题
  10. 一张纸厚度是多少毫米_一张纸对折后的厚度,有多可怕!——北京市第二十中学教科室“科技云课堂”(4)...