首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python time.sleep花费的时间比预期的要长(多线程)

问题描述: 在使用Python的多线程编程中,使用time.sleep()函数时,发现花费的时间比预期的要长。请解释这个现象的原因,并提供解决方案。

回答: 在多线程编程中,使用time.sleep()函数时,花费的时间比预期的要长,这是由于Python的全局解释器锁(Global Interpreter Lock,GIL)机制导致的。

GIL是Python解释器中的一个机制,它确保同一时间只有一个线程在解释器中执行Python字节码。这意味着在多线程编程中,即使有多个线程同时运行,但它们不能真正并行执行,而是通过在不同线程之间切换来模拟并发。

当一个线程调用time.sleep()函数时,它会释放GIL,让其他线程有机会执行。然而,由于GIL的存在,其他线程仍然无法真正并行执行,而是需要等待GIL被释放后才能执行。因此,即使调用time.sleep()函数等待指定的时间,实际上花费的时间可能会比预期的要长。

解决这个问题的方法是使用多进程而不是多线程。在Python中,多进程可以实现真正的并行执行,因为每个进程都有自己的解释器和GIL。可以使用multiprocessing模块来创建和管理多个进程。

另外,如果需要在多线程中精确控制时间,可以考虑使用time.monotonic()函数来代替time.sleep()。time.monotonic()函数返回一个单调递增的浮点数,可以用于测量时间间隔,而不受GIL的影响。

总结: 在多线程编程中,使用time.sleep()函数时,花费的时间比预期的要长,这是由于Python的GIL机制导致的。解决这个问题的方法是使用多进程而不是多线程,或者使用time.monotonic()函数来精确控制时间间隔。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python3.9多线程_python多线程没用

与分隔进程相比,进程中线程之间隔离程度小,它们共享内存、文件句柄 和其他进程应有的状态。 因为线程划分尺度小于进程,使得多线程程序并发性高。...因此使用多线程来实现多任务并发执行比使用多进程效率高 python语言内置了多线程功能支持,而不是单纯地作为底层操作系统调度方式,从而简化了python多线程编程。...,花费时间短 当调用start()时,才会真正创建线程,并且开始执行 函数式创建多线程 python多线程使用threading模块,threading模块调用Thread类 self, group...由于线程之间是进行随机调度,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果不可预期,我们因此也称为线程不安全。...),所以python多线程对CPU密集型代码并不友好。

97610

Python多线程实现程序加速

多线程即同时执行多个应用程序,这样可以减少时间消耗,提高程序性能,所以下面就和大家分享Python多线程实现。主要包括以下几个方面: 什么是Python多任务处理? 什么是线程?...何时在Python中使用多线程? 如何在Python中实现多线程多线程优点 什么是Python多任务处理? 通常,多任务处理是同时执行多个任务能力。...如何在Python中实现多线程Python多线程可以通过导入threading模块来实现。在导入此模块之前,可以使用pip3安装。要在anaconda环境中可以使用conda命令安装。...Python线程可以通过三种方式创建: 没有创建一个类 通过扩展Thread类 没有扩展Thread类 没有创建一个类 Python多线程也可以在不创建类情况下完成。...通过以上一个简单示例比较可以看出与不使用线程执行相同程序所花费时间相比,我们使用线程所花费时间少得多。因此在执行多个相互间不冲突任务时,可以通过多线程进行程序加速。

1.5K40

浅谈 Python多线程

在编写 Python 程序时候我们也会遇到这种“同时”需求,同时有大量请求过来,我们同时对它们进行处理,那么这个处理方法,就是「多线程」编程。...01.创建「线程」 Python 标准库中自带了多线程相关模块,使在 python 中创建线程成了一件很简单事。与线程相关模块一共有两个:thread 和 threading。...(1),如果只是用 for 循环的话,这个程序至少得运行 4 秒,但是由于我们用是线程并发运行,其实整个程序只需要花费 1 秒多就可以运行完毕,你可以自行尝试一下,可以 sleep 时间点自行体验一下...03.写在之后 其实很多人认为 Python 多线程是一个相当“鸡肋”东西,因为标准 Python 系统中使用了 GIL(全局解释器锁),它作用是避免 Python 解释器中线程问题,这样造成了在任意时刻只有一个线程在执行...,这类操作我们统一称为 I/O 操作,对于这类,才是真正显示 Python 多线程能力时候。

56040

python多线程详解(超详细)

大家好,又见面了,我是你们朋友全栈君。 python多线程是一个非常重要知识点,今天为大家对多线程进行详细说明,代码中注释有多线程知识点还有测试用实例。...与分隔进程相比,进程中线程之间隔离程度小,它们共享内存、文件句柄 和其他进程应有的状态。 因为线程划分尺度小于进程,使得多线程程序并发性高。...因此使用多线程来实现多任务并发执行比使用多进程效率高 python语言内置了多线程功能支持,而不是单纯地作为底层操作系统调度方式,从而简化了python多线程编程。...由于线程之间是进行随机调度,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果不可预期, 我们因此也称为“线程不安全”。...而在pypy和jpython中是没有GIL python在使用多线程时候,调用是c语言原生过程。

37820

浅谈 Python多线程

本文作者:Rocky0249 公众号:Python空间 00.写在之前 大家好,我是 Rocky0429,今天我来写一下 Python多线程。...在编写 Python 程序时候我们也会遇到这种“同时”需求,同时有大量请求过来,我们同时对它们进行处理,那么这个处理方法,就是「多线程」编程。...01.创建「线程」 Python 标准库中自带了多线程相关模块,使在 python 中创建线程成了一件很简单事。与线程相关模块一共有两个:thread 和 threading。...(1),如果只是用 for 循环的话,这个程序至少得运行 4 秒,但是由于我们用是线程并发运行,其实整个程序只需要花费 1 秒多就可以运行完毕,你可以自行尝试一下,可以 sleep 时间点自行体验一下...,这类操作我们统一称为 I/O 操作,对于这类,才是真正显示 Python 多线程能力时候。

65430

Python多线程实现程序加速

多线程即同时执行多个应用程序,这样可以减少时间消耗,提高程序性能,所以下面就和大家分享Python多线程实现。主要包括以下几个方面: 什么是Python多任务处理? 什么是线程?...何时在Python中使用多线程? 如何在Python中实现多线程多线程优点 什么是Python多任务处理? 通常,多任务处理是同时执行多个任务能力。...如何在Python中实现多线程Python多线程可以通过导入threading模块来实现。在导入此模块之前,可以使用pip3安装。要在anaconda环境中可以使用conda命令安装。...Python线程可以通过三种方式创建: 没有创建一个类 通过扩展Thread类 没有扩展Thread类 没有创建一个类 Python多线程也可以在不创建类情况下完成。...通过以上一个简单示例比较可以看出与不使用线程执行相同程序所花费时间相比,我们使用线程所花费时间少得多。因此在执行多个相互间不冲突任务时,可以通过多线程进行程序加速。

92620

Python | Python学习之多线程详解

多进程详解 在Python中如何创建多线程?...通过Thread创建多线程 通过Thread子类创建多线程 pythonthreading模块是对thread做了一些包装,可以更加方便被使用,线程方法和进程基本相似,这里就不多赘述,下面举几个栗子...此时系统把线程2调度为”sleeping”状态,线程1再做自增操作时,num还是刚刚获取到0,此往复下去,最终结果就不是我们所预期了。...所以在python多线程是假,因为在执行过程中CPU中只有一个线程在执行。 当你使用多进程时,你效率是高于多线程。...Python GIL经常被认为是一个神秘而困难的话题,但是请记住作为一名Python支持者,只有当您正在编写C扩展或者您程序中有计算密集型多线程任务时才会被GIL影响。

73630

Python并发编程(2)线程实现

Python中线程实现 线程 在Python中,threading 库提供了线程接口。我们通过threading 中提供接口创建、启动、同步线程。 例1....{delta:.3f} 秒') 运行结果: 运行结果 你会发现这个多线程版本并没有变快,这并不意外。...介绍线程时说过,因为GIL存在,多线程无法同时执行,甚至因为创建和切换线程产生额外开销导致耗时增加。...小结: 在GIL限制下,Python线程对于并行计算没有用处,但是对于等待(IO、网络、后台任务)是有用处。下一节我们会看一些Python线程实际案例。...对GIL补充: GIL是Python最常用实现CPython限制,某些实现(如Jython)中没有GIL。

18010

python线程间通信方式_android 线程间通信

大家好,又见面了,我是你们朋友全栈君。 1、python多线程 #!...1 return a print(dis.dis(add)) # Python中一个线程对应于C语言中一个线程(CPython而言)(Python并不一定就慢,视情况而定) #pypy解释器专门克服...gil慢一种解释器(去gil化) #GIL使用同一个时刻只有一个线程在一个cpu上执行字节码,无法将多个线程映射到多个CPU上 #gil锁会根据执行字节码或时间片划分适当释放(python内部实现机制...(用两种方法实现Python多线程编写) #1、通过Thread类实例化(适用简单或是线程池) #以模拟简单爬取文章列表页在获取详情页作一示例 import time import threading...queue #共享变量操作并不是线程安全操作,为了达到预期效果必须在这些操作上加上一把锁,能够安照预期效果在线程之间按照顺序进行同步 #多进程中共享变量是行不通 #声明一个全局变量,将这个全局变量在各个线程中使用

64120

浅谈python多线程和多进程

本文以一个简单例子介绍python多线程和多进程差别。 我们在进行生信分析时经常处理大文件,如果用串行运算往往费时,所以需要并行运算以节省时间。...不同编程语言中多线程和多进程实现机制是不一样,其实我们不关心实现机制,我们关注是实际性能。本文以python语言为例,用一个测试脚本来比较python多线程和多进程性能区别。...我们知道,python中常用多线程模块是threading,常用多进程模块是multiprocessing。...我们测试脚本解决是一个运算量比较大任务,根据是否(并行)运算以及使用哪种并行运算可以分为四种情形: 不进行计算 串行运算 多线程运算 多进程运算 得到结果如下: ?...上述结果值得讨论有两个: 为什么python多线程运算所用时间比串行运算还多?

77110

python多线程菜鸟教程_python实现多线程有几种方式

大家好,我是架构君,一个会写代码吟诗架构师。今天说一说python多线程菜鸟教程_python实现多线程有几种方式,希望能够帮助大家进步!!!...python多线程是一个非常重要知识点,今天为大家对多线程进行详细说明,代码中注释有多线程知识点还有测试用实例。 码字不易,阅读或复制完了,点个赞!...与分隔进程相比,进程中线程之间隔离程度小,它们共享内存、文件句柄 和其他进程应有的状态。 因为线程划分尺度小于进程,使得多线程程序并发性高。...因此使用多线程来实现多任务并发执行比使用多进程效率高 python语言内置了多线程功能支持,而不是单纯地作为底层操作系统调度方式,从而简化了python多线程编程。...由于线程之间是进行随机调度,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果不可预期, 我们因此也称为“线程不安全”。

69510

python 在threading中如何处理主进程和子线程关系

之前用python多线程,总是处理不好进程和线程之间关系。后来发现了join和setDaemon函数,才终于弄明白。下面总结一下。...[t.start() for t in ts] [t.join() for t in ts] end01 = time.time() - start01 logging.info(f"线程花费时间...[p.start() for p in ps] [p.join() for p in ps] end02 = time.time() - start02 logging.info(f"进程花费时间...ctx.freeze_support() main(ctx) 输出: 2019-10-06 14:17:22,729 【 7412 】 MainProcess 线程花费时间:0.012967586517333984...秒 2019-10-06 14:17:25,671 【 7412 】 MainProcess 进程花费时间:2.9418249130249023秒 以上这篇python 在threading中如何处理主进程和子线程关系就是小编分享给大家全部内容了

2.7K10

Python:线程之定位与销毁

背景 开工前我就觉得有什么不太对劲,感觉背锅。这可不,上班第三天就捅锅了。 我们有个了不起后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件功能。...这可不行啊,得想个办法清理呀,要不然怕是炸了。 那么怎么清理呢?...直接用下面代码来模拟这个线程: Python 版本多线程 #coding: utf8 import threading import os import time def tt(): info...用别的语言版本多线程来测试下: C 版本多线程 #include #include #include #include<pthread.h...我们甚至也无法通过信号杀死进程那样直接杀线程,因为 kill 只有对付进程才能达到我们预期,而对付线程明显不可以,不管杀哪个线程,整个进程都会退出!

1.5K40

python每天定时9点执行_python定时执行方法

time.time())) schedule.enter(4,0,func,(“test1”,time.time())) schedule.run() print(time.time()) 其中func中放执行函数...,用schedule.enter加入执行函数,里面的第一个参数是延迟执行时间,用sched.scheduler进行初始化 1512033155.9311035 now is 1512033157.9316308...,后面的主线程就不会执行 3 用threading里timer,实现非阻塞型,即主线程任务同时执行 import time from threading import Timer def print_time...多线程并非真正多线程导致 每天某个时间定时执行任务: import datetime import time def doSth(): print(‘test’) # 假装做这件事情需要一分钟 time.sleep...doSth() main() 4 linux用 crontab 发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/160693.html原文链接:https://javaforall.cn

2.6K20

多线程 VS 多进程(一)

,一个进程可以有多个线程 轻量化进程 一个进程多个线程间共享数据和上下文运行环境 共享互斥问题 全局解释器锁(GTL) python 代码执行是由python 虚拟机进行控制 在主循环中只能有一个控制线程在执行...python 包 thread:有问题,不好用,python3改成了_thread threading:通行包 案例01: 顺序执行,耗时比较长 ''' 利用time函数,生成两个函数 程序调试...,传参数 ```python # 利用time延时函数,生成两个函数 # 利用多线程调用 # 计算总运行时间 # 练习带参数多线程启动方法 import time # 导入多线程包并更名为...(): 等待多线程执行完成 案例04 ```python # 利用time延时函数,生成两个函数 # 利用多线程调用 # 计算总运行时间 # 练习带参数多线程启动方法 import...案例05:加入join后比较案例04结果异同 ```python # 利用time延时函数,生成两个函数 # 利用多线程调用 # 计算总运行时间 # 练习带参数多线程启动方法

448127

Python多线程(上)

前言 说起Python多线程,很多人都嗤之以鼻,说Python多线程是假多线程,没有用,或者说不好用,那本次就和大家一起来分享一下Python多线程,看看是不是这样。...多线程语法 在Python中实现多线程编程需要用到就是threading模块中Thread类,我们来看看最简单语法,我们首先来一个简单函数。...ts.append(t) for t in ts: t.join() end = time.time() print(end - start) # 55.022353172302246 你会发现多线程比单线程花费时间还要更多...GIL全称是Global Interpreter Lock(全局解释器锁),Python最初设计理念在于,为了解决多线程之间数据完整性和状态同步问题,设计为在任意时刻只能由一个线程在解释器中运行。...因此Python多线程是表面上多线程(同一时刻只有一个线程),不是真正多线程。 但是如果是因为GIL原因,就说多线程无用是不对,对于IO密集程序,多线程是要比单线程快

17930

python2和3区别丶网络编程以及s

一丶python2和python3区别   1.编码&字符串     字符串:       python2:         Unicode    v = u"root"  本质上用unicode存储...服务器只有十三台 三丶socketserver和多线程   socketserver     对照图看源码: ?     ...执行serve_forever相关代码: ?    2.多线程     在多线程操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU基本单位,是花费最小开销实体。...import time import threading def task(a1,a2,a3): time.sleep(3) print('拿快递') def play():...,让服务器去执行,每个请求10秒后完成.代码如下 import time import threading def task(n): print('开始执行任务:',n) time.sleep

52430

python中delay__python delay函数「建议收藏」

()sleep(5)prin python 暂停几秒执行下一步、 在代码开头引入time模块:import time 在需要延时地方加入语句:time.sleep(1) (括号中1意为停顿1秒,想停顿时间更长可以换数字...python如何微秒级延时? 貌似最小延时就是time.sleep(0.001)请问如何实现微秒级延时?...(‘world’) python 多线程如何延时 import timefrom threading import Thread## 定时输入class k(object):x=0sleepTime=0def...time.sleep 随机数 请问python中用time.sleep休眠程序,时间可以随机吗?...python如何在显示毫秒秒表时候同时定时循环截图参考网上写了如下代码,这代码是在一个窗体上显示毫秒秒表,然后在显示>> #加了上面这段while运行时窗体不显示只是后台在截图,这是为什么,怎么处理

1.8K40
领券