我有一个特定类的对象列表,其中每个对象都有一个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
函数的警报,因为我可能还会有其他汽车在各自的行驶时间进入。
答案 0 :(得分:2)
您可以使用threading.Timer
在指定的时间间隔后在单独的线程中调度目标函数的执行。
计时器对象
此类表示仅在经过一定时间(计时器)后才应执行的操作。 Timer是Thread的子类,因此也可以作为创建自定义线程的示例。
与线程一样,通过调用其start()方法来启动计时器。可以通过调用cancel()方法来停止计时器(在其动作开始之前)。计时器在执行其操作之前将等待的时间间隔可能与用户指定的时间间隔不完全相同。 docs
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
答案 1 :(得分:0)
您不需要不时检查当前时间。您可以计算线程等待并调用time.sleep
所需的秒数。
与this answer结合使用,您将得到:
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