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 执行value=random.sample,然后线程 2value=random.sample 线程 1 到达remove. 因此,当线程 2 到达那里时,该项目仍在列表中。因此,两个线程都有机会获得相同的 IP。

于 2012-12-17T16:01:22.973 回答