2014-04-09 7 views
0

스크립트를 실행하면 단계가 완벽하게 작동하지만 스레딩을 사용할 때 50-60 %가 손실됩니다. Python 멀티 스레딩 작업이 누락되었습니다

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

내가 200 초당 요청 그들 모두가 처리와 같은 전송하는 유사한 스크립트가 : 나는 파이썬 + 모듈을

#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 

을 기계화 그리고 이렇게 결국 그들에게 전화 사용하고 있습니다 . 나 또한 time.sleep (2)를 사용하여 시도했지만, 다시 많이 빠져있다. 내 스크립트에서 잘못된 점 이외의 다른 질문은 1000 명의 사용자를 사용하고 스크립트가 수천 줄에 이르기 때문에이 코드를 압축하는 것입니다. 미리 감사드립니다.

+2

왜 모든 작업을 저장하기 위해'Queue.Queue' 클래스를 사용하지 않습니까? 그런 다음 스레드 풀을 사용하여 큐의 작업을 처리 할 수 ​​있습니다. –

+0

"misses"라고하면 정확히 무엇을 그리는가? – Torxed

+0

@ 게시 된 데이터를 서버로 보내도록 설정했습니다. 예 : user1의 경우 tab1의 작업, user2의 경우 작업은 tab2입니다. 그래서 무작위로 완료됩니다. – MikeT

답변

1
from threading import * 

submits = [[1,2,3], [3,4,5], [6,7,8]]  

class worker(Thread): 
    def __init__(self, site, postdata, data): 
     Thread.__init__(self) 
     self.data = data 
     self.site = site 
     self.postdata = postdata 
     self.start() 
    def run(self): 
     for i in self.data: 
      browser.open("http://example.com/jobs.php?actions="+str(i)) 
      browser.open(self.site, self.postdata) 
for obj in submits: 
    worker('http://example.com/managament.php?', {'UserID' : '', 'Action':'Delete'}, submits) 

OP가 요청 했으므로 압축 된/압축 된 버전의 코드가 있습니다.

나 :

for index in range(0,1000): 
    worker('http://example.com/managament.php?', {'UserID' : '', 'Action':'Delete'}, [i for i in range(1,4)]) 

실제로 전송할 데이터가 완벽한 순서로 경사 3 개 정수 (1,2,3)의 순서 인 경우.

+0

'submits'는 목록이므로 스레드로부터 안전하지 않습니다 –

+0

@GamesBrainiac 예를 들어이 특정 인스턴스에서는 업데이트되거나 크기가 반복 될 때 문제가 발생할 수 있습니까? 그렇지 않다면 보편적으로 작동하지 않는 무언가를 가르치기위한 IMO의 나쁜 아이디어입니다. 다른 변수 유형이 사용되는 경우) 문제가 발생합니다. Eveno tho 세마포 객체 또는 대기열을 사용해야합니다. – Torxed

+0

채팅에서이 문제를 논의 할 수 있습니다. –

1

다음은 초기 변수를 변경하여 쉽게 수정할 수있는 전체 스크립트입니다. 동적으로 목록을 만들고 생성기를 사용하여 각 스레드에 대한 함수를 만듭니다. 현재 각각 1,000 명의 사용자가 생성되며, 각 사용자는 2 개의 탭과 3 개의 작업이 있습니다.

# 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) 
+0

나는해야한다. 말하자면 이미 큰 코드 세트를 훨씬 더 복잡한 코드로 변환했습니다. 나는 그것이 작동한다고 확신하지만'for '루프는 꽤 많이 응축 될 수 있습니다. – Torxed

+0

이것은 몇 천 줄보다 더 큰 방법은 무엇입니까? 더 응축 될 수 있습니다. – bosnjak