0

スクリプトを段階的に実行すると完全に機能しますが、スレッドを使用しているときは 50 ~ 60% 失敗します。Python + mechanize モジュールを使用しています

#setting up the browser
mySite = 'http://example.com/managament.php?'
postData = {'UserID' : '', 'Action':'Delete'}
job_tab1_user1 = [1,2,3]
job_tab2_user1 = [4,5,6]
job_tab1_user2 = [7,8,9]
job_tab2_user2 = [10,12,13]
.... till user1000
#i want to point out that the lists are 100% different
def user1_jobs:
    for i in job_tab1_user1:
        browser.open("http://example.com/jobs.php?actions="+i) 
        browser.open(mySite, Post_data)
    for i in job_tab2_user1:
        browser.open("http://example.com/jobs.php?actions="+i) 
        browser.open(mySite, Post_data)
def user2_jobs:
    for i in job_tab1_user2:
        browser.open("http://example.com/jobs.php?actions="+i) 
        browser.open(mySite, Post_data)
    for i in job_tab2_user2:
        browser.open("http://example.com/jobs.php?actions="+i) 
        browser.open(mySite, Post_data)
... and so on till user 1000

そして、私は最終的にそれらを次のように呼び出します。

t_user1 = threading.Thread(target=user1_jobs, args=[])
t_user1.start()
t_user2 = threading.Thread(target=user2_jobs, args=[])
t_user2.start()

1 秒あたり 200 件のリクエストを送信する同様のスクリプトがあり、それらはすべて処理されます。私も time.sleep(2) を使用してみましたが、やはり不足しています。私のスクリプトの何が問題なのかということ以外に、このコードを圧縮する方法があるかどうかという別の質問があります。これは、1000 人のユーザーを使用しており、スクリプトが数千行に達するためです。前もって感謝します。

4

2 に答える 2

1

初期変数を変更することで簡単に変更できる完全なスクリプトを次に示します。リストを動的に作成し、ジェネレーターを使用して各スレッドの関数を作成します。現在、それぞれ 2 つのタブと 3 つのジョブを持つ 1000 人のユーザーを作成しています。

# define your variables here
NUM_USERS = 1000
NUM_JOBS_PER_USER = 3
NUM_TABS_PER_USER = 2
URL_PART = "http://example.com/jobs.php?actions="

# populate our list of jobs
# the structure is like this: jobs[user][tab][job]

jobs = [[[0 for y in range(NUM_JOBS_PER_USER)] \
            for x in range(NUM_TABS_PER_USER)] \
            for x in range(NUM_USERS)]
p = 1
for i in range(NUM_USERS):
    for j in range(NUM_TABS_PER_USER):
        for k in range(NUM_JOBS_PER_USER):
            jobs[i][j][k] = p
            p += 1


# create a generator that builds our thread functions
def generateFunctions(jobs):
    for user in jobs:
        for tab in user:
            for job in tab:
                def f():
                    browser.open(URL_PART + str(job))
                    browser.open(mySite, Post_data)
                yield f

# create and start threads, add them to a list
# if we need to preserve handlers for later use
threads = []
for f in generateFunctions(jobs):
    thr = threading.Thread(target = f, args=[])
    thr.start()
    threads.append(thr)
于 2014-04-09T07:51:10.717 に答える