Running a timer for few minutes in python

浪子不回头ぞ 提交于 2019-12-24 17:04:01

问题


I am trying to run a certain function "foo" every second. I have to do this for a few minutes (say 5).

The function foo() makes 100 HTTP Requests (which contains a JSON object) to the server and prints the JSON response.

In short, I have to make 100 HTTP requests per second for 5 minutes.

I have just started learning python, thus don't have extensive knowledge. This is what I have tried:

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()

Due to multiple threads, the function foo isn't called 300 times but much much more than that. I have tried setting a lock too:

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()

Rest of code is same as the previous code snippet. But this also does not work.

How do I do this?

Edit: Different Approach

I have tried this approach which worked for me:

def foo():
    noOfSecondsPassed = 0
    while noOfSecondsPassed < 300:
       #Code to make 100 HTTP requests
       noOfSecondsPassed +=1
       time.sleep(1.0)
foo()

Any disadvantages in doing so?


回答1:


I would use another approach which is easier I think.

Create 300 timer thread, each running 1 sec after the previous. The main loop is executed in almost an instant so the error factor is very low. Here's a sample Demo:

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()

This code output should look like this:

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                         
...

As you can see, each thread is launched about 1 sec after the previous and you are starting exactly 300 threads.



来源:https://stackoverflow.com/questions/12672750/running-a-timer-for-few-minutes-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!