1

特定の関数「foo」を毎秒実行しようとしています。私はこれを数分間しなければなりません(たとえば5)。

関数foo()は、サーバーに対して100個のHTTPリクエスト(JSONオブジェクトを含む)を作成し、JSONレスポンスを出力します。

つまり、1秒あたり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()

そうすることの不利な点はありますか?

4

1 に答える 1

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スレッドを開始しています。

于 2012-10-01T12:15:36.387 に答える