执行结果:
Begin to add ...Do main task...
Sleep start...
Sleep end...
Sleep start...
Finish main task...
Stop task...
sum: 10
Sleep end...
Finish add,sum: 20...
解释一下这段代码的意思。在主线程里面,我调用do_main_task
()
触发了一个任务。这个任务执行会久一些(这里设定15s)。但是这个任务完成以后,会有个返回值,告诉我完成了。另外创建一个 add_task 子线程,每10秒累加10。
但某些情况下,我不需要等待了,例如用户主动取消了任务。这个时候,我就想提前结束这个 add_task 子线程。
通过执行结果可以看出,当执行一次+10,等待10s后,又过了5秒,主线程do_main_task结束了,这时add_task线程还在累加的sleep(10)中没有退出。主线程执行结果已经是sum=10,再过5秒后add_task线程才结束。
但是,线程是不能从外面主动杀死的,只能让它自己退出。
2、方法二 event.wait
应用threading
模块里面的
Event,
用法和sleep差不多:
import threading
event = threading.Event()
event.wait(5)
上述例子可以这样实现:
import time
from threading import Thread
from threading import Event
class AddTask(Thread):
def __init__(self):
super().__init__()
self.sum_num = 0
self.event = Event()
def run(self):
print('Begin to add ...')
while not self.event.is_set():
print('Sleep start...')
self.event.wait(10)
print('Sleep end...')
self.sum_num += 10
print(f"Finish add, sum:{self.sum_num}...")
def stop(self):
print('Stop task...')
self.event.set()
def do_main_task():
print('Do main task...')
time.sleep(15)
print('Finish main task...')
return True
if __name__ == '__main__':
add_task = AddTask()
add_task.start()
main_task_end = do_main_task()
if main_task_end:
add_task.stop()
time.sleep(1)
print(f"sum: {add_task.sum_num}")
执行结果:
Do main task...
Begin to add ...
Sleep start...
Sleep end...
Sleep start...
Finish main task...
Stop task...
Sleep end...
Finish add, sum:20...
sum: 20
当执行event.set()后,子线程里面self.event.is_set()就会返回 False,于是这个循环就不会继续执行了。
即使self.event.wait(10)刚刚开始阻塞,只要我在主线程中执行了event.set(),子线程里面的阻塞立刻就会结束。于是子线程立刻就会结束。不需要再白白等待10秒。
并且,event.wait()这个函数在底层是使用 C 语言实现的,不受 GIL 锁的干扰。
sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。
因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放
event.wait(time) 等待 time 时间后,执行下一步。或者在调用 event.set() 后立即执行下一步。
event.clear() 清除信号
event.set() 设置信号
event.isSet() 判断是否设置信号
定义一个按钮,等待 3秒钟,如果 3秒钟没有再次被点击,则执行下一步。否则,重新等待 3秒。
定义执行函数
def dem...
最近在写爬虫,由于单个账号访问频率太高会被封,所以需要在爬虫执行一段时间间隔后自己循环切换账号
所以就在想,有没有像单片机那样子设置一个定时中断,再定义一个中断入口,这样子每隔一段时间执行一次中断
当然不能用sleep,这样子整个进程就停在这了,而不是接着爬数据
用到threading的Timer,也类似单片机那样子,在中断程序中再重置定时器,设置中断,pytho...
//
Sleep pauses the current goroutine for at least the duration d.
// A negative or zero duration causes
Sleep to return immediately.
func
Sleep(d Duration)
今天写代码的时候,我已经码好了,但突发奇想想从中间对中间以上代码进行重构,这样运行势必导致中间以下代码报错,为了方便调试,打印信息,我开始寻找如何暂停程序的方法,使程序只运行中间以上的代码。
三种方法:
参见:
Python基础之程序暂停
sleep() 方法是 Python 的内置函数,属于 time 库的一部分。它的作用是让程序暂停执行 t 秒钟,在这段时间内,程序不会执行任何操作。
使用方法如下:
import time
time.sleep(t)
其中 t 是暂停时间,以秒为单位。
例如,如果要让程序暂停 2 秒,就可以写成这样:
import time
time.sleep(2)
注意,sleep() 方法的暂停时间是...
sleep() 方法暂停给定秒数后执行程序。该参数可以是一个浮点数来表示一个更精确的睡眠时间。
实际中止时间可能不到所请求的,因为任何捕获信号将终止 sleep()接下来执行该信号捕捉的程序。
以下是sleep()方法的语法:
time.sleep(t)
参数 t – 这是要暂停执行的秒数。 返回值
此方法不返回任何值。
下面的示例说明 sleep()方法的使用。
#!/usr/bin...
Python-3.9.13-amd64.exe是Python的一个安装程序,可以在64位的Windows操作系统上安装Python 3.9.13版本的解释器和相关工具。Python是一种高级编程语言,它被广泛应用于数据科学、人工智能、Web开发和自动化脚本编写等领域。Python-3.9.13-amd64.exe安装程序是Python官方提供的一种便捷的安装方式,通过运行这个程序可以轻松地将Python解释器和相关的第三方库、工具一同安装到电脑上。
Python-3.9.13-amd64.exe的安装过程简单易懂,用户只需按照指示进行下一步操作即可。安装完成后,用户可以在命令行窗口中使用python命令来启动Python解释器。在Python解释器中,用户可以进行代码运行、调试、交互式探索等活动,还可以使用第三方库来扩展Python的功能。
总之,Python-3.9.13-amd64.exe是Python的一个重要安装程序,它使得Python的安装和使用变得更加便捷和简单,为Python用户提供了一个方便快捷的编程环境。