我试图每秒运行某个功能“foo”。我必须这样做几分钟(比如5)。
函数foo()向服务器发出100个HTTP请求(包含JSON对象)并打印JSON响应。
简而言之,我必须每秒发出100次HTTP请求,持续5分钟。
我刚刚开始学习python,因此没有广泛的知识。这就是我的尝试:
import threading
noOfSecondsPassed = 0
def foo():
global noOfSecondsPassed
# piece of code which makes 100 HTTP requests (I use while loop)
noOfSecondsPassed += 1
while True:
if noOfSecondsPassed < (300) # 5 minutes
t = threading.Timer(1.0, foo)
t.start()
由于多线程,函数foo不会被调用300次,而是远远超过它。 我也试过设置一个锁:
def foo():
l = threading.Lock()
l.acquire()
global noOfSecondsPassed
# piece of code which makes 100 HTTP requests (I use while loop)
noOfSecondsPassed += 1
l.release()
其余代码与之前的代码段相同。但这也行不通。
我该怎么做?
编辑:不同方法
我尝试过这种方法对我有用:
def foo():
noOfSecondsPassed = 0
while noOfSecondsPassed < 300:
#Code to make 100 HTTP requests
noOfSecondsPassed +=1
time.sleep(1.0)
foo()
这样做有什么不利之处吗?
答案 0 :(得分:1)
我会使用另一种方法,我认为这更容易。
创建300个计时器线程,每个线程在前一个运行1秒后运行。主循环几乎立即执行,因此误差因子非常低。 这是一个示例演示:
import datetime
import thread
import threading
def foo():
print datetime.datetime.now()
print threading.active_count()
for x in range(0,300):
t = threading.Timer(x + 1, foo)
t.start()
此代码输出应如下所示:
2012-10-01 13:21:07.328029
301
2012-10-01 13:21:08.328281
300
2012-10-01 13:21:09.328449
299
2012-10-01 13:21:10.328615
298
2012-10-01 13:21:11.328768
297
2012-10-01 13:21:12.329006
296
2012-10-01 13:21:13.329289
295
2012-10-01 13:21:14.329369
294
2012-10-01 13:21:15.329580
293
2012-10-01 13:21:16.329793
292
2012-10-01 13:21:17.329958
291
2012-10-01 13:21:18.330138
290
2012-10-01 13:21:19.330300
289
...
正如您所看到的,每个线程在前一个之后大约1秒启动,并且您正在启动300个线程。