在python中运行计时器几分钟

在python中运行计时器几分钟,python,multithreading,timer,python-multithreading,Python,Multithreading,Timer,Python Multithreading,我试图每秒运行一个函数“foo”。我必须这样做几分钟(比如说5分钟) 函数foo()向服务器发出100个HTTP请求(其中包含一个JSON对象)并打印JSON响应 简而言之,我必须在5分钟内每秒发出100个HTTP请求 我刚刚开始学习python,因此没有广博的知识。这就是我尝试过的: import threading noOfSecondsPassed = 0 def foo(): global noOfSecondsPassed # piece of code which mak

我试图每秒运行一个函数“foo”。我必须这样做几分钟(比如说5分钟)

函数foo()向服务器发出100个HTTP请求(其中包含一个JSON对象)并打印JSON响应

简而言之,我必须在5分钟内每秒发出100个HTTP请求

我刚刚开始学习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()
其余代码与前面的代码段相同。但这也不起作用

我该怎么做

编辑:不同的方法

我尝试过这种方法,这种方法对我很有效:

def foo():
    noOfSecondsPassed = 0
    while noOfSecondsPassed < 300:
       #Code to make 100 HTTP requests
       noOfSecondsPassed +=1
       time.sleep(1.0)
foo()
def foo():
noofsecondpassed=0
当noOfSecondsPassed<300时:
#生成100个HTTP请求的代码
NoofSecondPassed+=1
时间。睡眠(1.0)
foo()

这样做有什么缺点吗?

我想我会使用另一种更简单的方法

创建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个线程

我想我会使用另一种更简单的方法

创建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个线程

您是否考虑过一个shell脚本,它每秒启动一个后台进程来执行请求,总共60*5=300次?省去了使用多线程的麻烦。@Evert不,我没有。我不知道该怎么做。我试试看。Thanx.你不是应该首先比较noOfSecondsPassed而不是noOfSeconds吗?顺便说一句,
urllib
不是线程安全的。对我来说,在Linux上,它就像
一样简单/bin/bash\n对于'seq 300`\n中的i\n ndo\n./fetch\u url.py&\n sleep 1\n done\n
。我明确地在这里添加了新行:一行程序很容易被
&
搞砸。您是否考虑过一个shell脚本,它每秒启动一个后台进程来执行请求,总共60*5=300次?省去了使用多线程的麻烦。@Evert不,我没有。我不知道该怎么做。我试试看。Thanx.你不是应该首先比较noOfSecondsPassed而不是noOfSeconds吗?顺便说一句,
urllib
不是线程安全的。对我来说,在Linux上,它就像
一样简单/bin/bash\n对于'seq 300`\n中的i\n ndo\n./fetch\u url.py&\n sleep 1\n done\n
。我明确地在这里添加了新行:一行代码很容易被
&
搞砸。这很有帮助。但我尝试了另一种对我有效的方法(贴在下面)。抱歉,由于缺少声誉分数,无法对您的答案进行投票。Thanx:)无法将我的方法作为答案发布。编辑我的问题并添加到那里。这很有帮助。但我尝试了另一种对我有效的方法(贴在下面)。抱歉,由于缺少声誉分数,无法对您的答案进行投票。Thanx:)无法将我的方法作为答案发布。编辑我的问题并添加到那里。