python多线程、线程锁
1、python多线程 多线程可以把空闲时间利用起来 比如有两个进程函数 func1、func2,func1函数里使用sleep休眠一定时间,如果使用单线程调用这两个函数,那么会顺序执行这两个函数 也就是直到第一个函数执行完后,才会执行第二个函数,这样需要很长时间; 如果使用多线程,会发现这两个函数是同时执行的,这是因为多线程会把空闲的时间利用起来,在第一个函数休眠的函数就开始执行第二个函数 python多线程使用场景 如果程序时cpu密集型的,使用python的多线程是无法提升效率的,如果程序时IO密集型的,使用python多线程可以提高程序的整体效率 CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存), I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。 IO密集型(I/O bound) IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高 I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O操作,而pipeline做得不是很好,没有充分利用处理器能力 实例: import _thread as thread
from time import sleep, ctime def fun1():
print('开始运行func1', ctime())
# 休眠4秒
sleep(4)
print('func1运行结束', ctime())
def fun2():
print('开始运行func2', ctime())
# 休眠4秒
sleep(2)
print('func2运行结束', ctime())
def main():
print('开始运行时间', ctime())
# 启动一个线程运行func1函数
thread.start_new_thread(fun1, ())
thread.start_new_thread(fun2, ())
# 休眠6秒
sleep(6)
print('运行结束时间', ctime()) if __name__ == '__main__':
main() E:\python\python.exe E:/progect/untitled1/untitled1/urls.py
开始运行时间 Sat Feb 16 09:34:00 2019
开始运行func1 Sat Feb 16 09:34:00 2019
开始运行func2 Sat Feb 16 09:34:00 2019
func2运行结束 Sat Feb 16 09:34:02 2019
func1运行结束 Sat Feb 16 09:34:04 2019
运行结束时间 Sat Feb 16 09:34:06 2019 2、线程和锁 第一种 这里的锁并不是把程序锁住不退出,而是通过锁可以让程序了解是否还有线程函数没有执行,而且可以做到当所有的线程函数执行完后, 程序会立刻退出, allocate_lock 函数创建锁对象,然后使用锁对象的acquire方法获取锁,如果不需要锁了,可以使用锁对象的release方法释放锁, 如果判断锁是否被释放可以使用锁对象的locked方法 第二种 还可以使用Thread对象的join方法等待函数执行完毕再往下执行;等待所有线程函数都执行完毕后再推出程序(一般用这个) 实例: import threading
from time import sleep,ctime
def fun(index,sec):
print('开始执行',index,'时间',ctime())
sleep(sec)
print('执行结束',index,'时间',ctime())
def main():
#创建第1个Thread类,通过target关键字参数指定线程函数fun,传入索引10和休眠时间(4s)
thread1=threading.Thread(target=fun,args=(10,4))
#启动第1个线程
thread1.start()
#创建第2个Thread类,通过target关键字参数指定线程函数fun,传入索引20和休眠时间(2s)
thread2=threading.Thread(target=fun,args=(20,2))
#启动第2个线程
thread2.start()
#等待第1个线程函数执行完毕
thread1.join()
#等待第2个线程函数执行完毕
thread2.join()
if __name__ == '__main__':
main() E:\python\python.exe E:/progect/untitled1/untitled1/urls.py
开始执行 10 时间 Sat Feb 16 09:03:48 2019
开始执行 20 时间 Sat Feb 16 09:03:48 2019
执行结束 20 时间 Sat Feb 16 09:03:50 2019
执行结束 10 时间 Sat Feb 16 09:03:52 2019 生产者-消费者问题与quene模块
python多线程、线程锁的更多相关文章
- Python多线程-线程锁
多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...
- 孤荷凌寒自学python第四十天python 的线程锁RLock
孤荷凌寒自学python第四十天python的线程锁RLock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 因为研究同时在多线程中读写同一个文本文件引发冲突,所以使用Lock锁尝试同步, ...
- 孤荷凌寒自学python第三十九天python 的线程锁Lock
孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...
- 第十五章、Python多线程同步锁,死锁和递归锁
目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...
- Python学习---线程锁/信号量/条件变量同步/线程池1221
线程锁 问题现象: 多线程情况下,CPU遇到阻塞会进行线程的切换,所以导致执行了tmp-=1的值还未赋值给num=tmp,另一个线程2又开始了tmp -=1,所以导致最后的值重复赋值给了num,所以出 ...
- python多线程中锁的概念
1 2 3 4 5 6 7 8 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([time ...
- c++11多线程---线程锁(mutex)
#include<mutex> 包含四类锁: 1 std::mutex 最基本也是最常用的互斥类 2 std::recursive_mutex 同一线程内可递归 ...
- python多线程--线程同步
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步. 使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire ...
- python的线程锁
1.先看一个例子,一个进程可以起多个线程,多个线程都共享这个线程的内存 import threading import time num = 100 thread_lock = threading.L ...
- Python 多线程 线程安全、daemon简介 (四)
线程安全 只能在Winodws下的ipython中演示,Python命令行.Pycharm.Mac下的ipython都演示不出效果 import threading def worker(): for ...
随机推荐
- SQL Join 理解
对各种连接的理解,可以参照文章. 下面是对连接结果表条数统计的思考:假设有主表Ta有5条记录,从表Tb有4条记录 Ta corss join Tb, 结果为2表做笛卡尔积,5*4=20条 /*下面其它 ...
- Octave(数据绘制)
>> t=[:0.01:0.98]; >> y1 = sin(*pi**t); >> plot(t,y1); >> y2 = cos(*pi**t); ...
- PHP 基础知识-数组
PHP 的数组主要分为: 索引数组 - 带有数字索引的数组 关联数组 - 带有指定键的数组 多维数组 - 包含一个或多个数组的数组 索引数组: 有两种创建索引数组的方法: 索引是自动分配的(索 ...
- c# json数据解析——将字符串json格式数据转换成对象或实体类
网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...
- python_并发编程——进程池
1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...
- ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数
一.什么是ad-hoc和playbook ad-hoc : 如果我们敲入一些命令去快速的完成一些操作,而不需要将这些执行过的命令刻意保存下来,这样的命令就叫做as-hoc命令,这里不做过多赘述. p ...
- session.getdefaultinstance和getinstance的区别
如果想要同时使用两个帐号发送javamail,比如使用1@a.com发送1#邮件,使用2@a.com发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象.但是如果你仍然使用 ...
- 以下是Direct 3d的安装步骤
安装配置 真的是软肋 o( ̄ε ̄*) 我记录以下 步骤 防止下次忘记了 首先要安装到direct3d 之后在vs上配置 如下: 找到 安装direct3d的文件夹 复制路径(如下 我的路径为 G ...
- 【概率论】3-2:连续分布(Continuous Distributions)
title: [概率论]3-2:连续分布(Continuous Distributions) categories: Mathematic Probability keywords: Continuo ...
- Ubuntu14.04 挂载u盘
插入u盘后, $cat /proc/partitions 发现多了 sdb sdb4 sdb是统称,所以新插入的U盘就是/dev/sdb4 $ls /dev |grep sdb sdb sdb4 查看 ...