我正在尝试模拟电信网络以测试一些路由算法。请求根据泊松分布得出,它们的保持时间遵循指数分布。
在找到某个请求的路由后,应该激活定时器,以在特定保持时间间隔到期后更新剩余链路容量的值。我知道我可以使用threading.Timer来延迟调用某个函数,但是在保持时间到期之前许多其他请求将到达并且我需要为它们中的每一个运行单独的Timer。
与我的算法无关,今天我尝试运行此代码:
def hello(i):
print i
for i in range(0,10):
t = threading.Timer(2,hello,[i])
t.start()
我想以2秒的间隔打印范围(0,10)中的数字,但输出完全是奇怪的。几秒钟后我得到了:
0
1
32
4
5
6
7
89
所以,似乎我不能将Timer用于此目的。你对如何解决这个问题有所了解吗?
答案 0 :(得分:3)
如果两个线程同时打印,则一个线程可以在另一个线程完成之前开始打印。这可能会导致两条消息出现在一行上,或者一行中有两条换行要打印而没有内容。
您可以使用Lock对象阻止线程同时访问某些资源。在您的示例中,您可能希望限制对print
的访问权限。
import threading
print_lock = threading.Lock()
def hello(i):
#no other thread can execute `hello` as long as I hold this lock.
print_lock.acquire()
print i
#I'm done printing. Other threads may take their turn now.
print_lock.release()
for i in range(0,10):
t = threading.Timer(2,hello,[i])
t.start()
结果(许多人的一种可能性):
1
2
0
4
3
6
5
8
7
9