3

IP リストからすべての URL を抽出する必要があります。この python スクリプトを作成しましたが、同じ IP を複数回抽出すると問題が発生します (同じ IP でより多くのスレッドが作成されます)。マルチスレッドを使用して私のソリューションを改善できる人はいますか?

私の英語でごめんなさい、みんなありがとう

import urllib2, os, re, sys, os, time, httplib, thread, argparse, random

try:
    ListaIP = open(sys.argv[1], "r").readlines()
except(IOError): 
    print "Error: Check your IP list path\n"
    sys.exit(1)



def getIP():
    if len(ListaIP) != 0:
        value = random.sample(ListaIP,  1)
        ListaIP.remove(value[0])
        return value
    else:
        print "\nListaIPs sa terminat\n"
        sys.exit(1)

def extractURL(ip):
    print ip + '\n'
    page = urllib2.urlopen('http://sameip.org/ip/' + ip)
    html = page.read()
    links = re.findall(r'href=[\'"]?([^\'" >]+)', html)
    outfile = open('2.log', 'a')
    outfile.write("\n".join(links))
    outfile.close()

def start():
    while True:
        if len(ListaIP) != 0:
            test = getIP()
            IP = ''.join(test).replace('\n', '')
            extractURL(IP)
        else:
            break


for x in range(0, 10):
    thread.start_new_thread( start, () )

while 1:
    pass
4

1 に答える 1

5

を使用しthreading.Lockます。ロックはグローバルである必要があり、IP リストを作成するときに最初に作成します。

lock.acquireの開始時にgetIP()

メソッドをrelease終了する前に。

ご覧のとおり、スレッド 1 が を実行し、スレッド 1 が に到達する前にvalue=random.sampleスレッド 2 も実行されます。そのため、スレッド 2 がそこに到達した時点では、アイテムはまだリストにあります。したがって、両方のスレッドが同じ IP を取得する可能性があります。value=random.sample remove

于 2012-12-17T16:01:22.973 に答える