Python-如何创建一个等待给定时间执行函数的新线程



我有一个特定类的对象列表,其中每个对象都有一个unix时间属性。我想执行功能

class Car:
def __init__(self,  id, time):
self.id = id
self.time = time
objct = [Car(i, time_unix[i]) for i in range(10)]

其中time_unix是unix时间的列表。我想创建一个新线程,它将与此代码"并行"运行,并在其中检查当前时间。如果当前时间等于对象的一个unix_time,则将调用一个名为drive的新函数。

因此,我希望有一个线程能够不断地提醒调用drive函数,因为我可能会有其他汽车在各自的驾驶时间内驶入。

您可以使用threading.Timer在指定的时间间隔后在单独的线程中调度目标函数的执行。

计时器对象

这个类表示一个只有在经过一定时间后才应该运行的操作——一个计时器。Timer是Thread的一个子类,因此也可以作为创建自定义线程的示例。

计时器和线程一样,是通过调用它们的start((方法来启动的。可以通过调用cancel((方法来停止计时器(在其操作开始之前(。计时器在执行其操作之前等待的时间间隔可能与用户指定的时间间隔不完全相同。文档

from threading import Timer, current_thread
from datetime import datetime

def drive(car):
print(f'{datetime.now()} tid:{current_thread()} {car}: brumbrum')

class Car:
def __init__(self,  id, time):
self.id = id
self.time = time

if __name__ == '__main__':
N_CARS = 5
time_unix = {k: v for k, v in zip(range(N_CARS), range(N_CARS))}
cars = [Car(f'car_{i}', time_unix[i]) for i in range(N_CARS)]
for car in cars:
interval = car.time  # calculate delay in seconds for execution here
t = Timer(interval=interval, function=drive, args=(car.id,))
t.start()

输出示例:

2018-11-05 13:01:50.999886 tid:<Timer(Thread-2, started 139979005781760)> car_0: brumbrum
2018-11-05 13:01:52.000360 tid:<Timer(Thread-3, started 139978997389056)> car_1: brumbrum
2018-11-05 13:01:53.000452 tid:<Timer(Thread-4, started 139979005781760)> car_2: brumbrum
2018-11-05 13:01:54.000533 tid:<Timer(Thread-5, started 139978986825472)> car_3: brumbrum
2018-11-05 13:01:55.000625 tid:<Timer(Thread-6, started 139978978432768)> car_4: brumbrum
Process finished with exit code 0

您不需要不时检查当前时间。您可以计算线程需要等待多少秒并调用time.sleep

结合这个答案,你会得到:

from multiprocessing.dummy import Pool as ThreadPool
from time import sleep
pool = ThreadPool(4) 
cars = [('Car1', 3), ('Car2', 1), ('Car3', 2)]
def start_car(car, time_to_wait):
sleep(time_to_wait)
print("Starting %s after %d seconds" % (car, time_to_wait))
pool.starmap(start_car, cars)

它输出:

Starting Car2 after 1 seconds
Starting Car3 after 2 seconds
Starting Car1 after 3 seconds

最新更新