Python 螺纹参数
我又问了一个问题。。又有问题了。希望找到更聪明、更了解这一点的人D 我现在遇到了线程问题,当打开范围为(11000)的线程URL时,我希望看到所有不同的URL。只有当我运行代码时,我才会得到很多双变量(可能是因为爬网速度太快)。不管怎样,这是我的代码:我试着看它在哪个线程,但我得到了双倍Python 螺纹参数,python,multithreading,variables,thread-sleep,Python,Multithreading,Variables,Thread Sleep,我又问了一个问题。。又有问题了。希望找到更聪明、更了解这一点的人D 我现在遇到了线程问题,当打开范围为(11000)的线程URL时,我希望看到所有不同的URL。只有当我运行代码时,我才会得到很多双变量(可能是因为爬网速度太快)。不管怎样,这是我的代码:我试着看它在哪个线程,但我得到了双倍 import threading import urllib2 import time import collections results2 = [] def crawl(): var_Number
import threading
import urllib2
import time
import collections
results2 = []
def crawl():
var_Number = thread.getName().split("-")[1]
try:
data = urllib2.urlopen("http://www.waarmaarraar.nl").read()
results2.append(var_Number)
except:
crawl()
threads = []
for n in xrange(1, 1000):
thread = threading.Thread(target=crawl)
thread.start()
threads.append(thread)
# to wait until all three functions are finished
print "Waiting..."
for thread in threads:
thread.join()
print "Complete."
# print results (All numbers, should be 1/1000)
results2.sort()
print results2
# print doubles (should be [])
print [x for x, y in collections.Counter(results2).items() if y > 1]
但是,如果我在xrange行的正下方添加time.sleep(0.1),则不会出现这些双精度。虽然这确实让我的程序慢了很多。有人知道更好的解决方法吗?根据文档,这是一种正确的行为 如果希望每个线程都有一个唯一的名称,则必须使用 根据您最终的期望,替换
for n in xrange(1, 1000):
thread = threading.Thread(target=crawl)
thread.start()
threads.append(thread)
与
和var\u Number=thread.getName().split(“-”[1]
和var\u Number=thread.name
应该对您有所帮助
编辑在一些测试之后,用户自定义名称可以被另一个线程重用,因此通过
n
的唯一方法是使用的args
或kwargs
。这种行为很有意义,如果我们需要在线程中使用某种类型的数据,请正确地传递它,不要试图将其放在不属于它的地方。异常处理程序中有一个对
crawl()
的递归调用。如果出现错误,同一线程将多次运行该函数。因此,results2
可能多次包含相同的var\u编号。如果添加time.sleep(.1)
(暂停);您的脚本消耗更少的资源,例如,打开的FD数量、正在运行的线程以及对远程服务器的请求更可能成功
默认线程名称也可能重复。如果线程退出;另一个线程可能具有相同的名称,例如,如果实现使用.ident
属性生成名称
注:
- 使用。您可以使用pep8、pyflakes、epylint命令行工具自动检查代码
- 获取1000个URL不需要1000个线程(请参阅)
- 在不暂停的情况下生成对同一站点的请求是不好的
为什么您关心哪个线程请求url?你想做什么?我想这样抓取页面:,page/2/,page/3/,但是在我的代码中,当我不加时间时,我会得到一些双精度。同样的问题,我会得到双精度。。Run1:=['58',88',81',63',16',42',78',Run2:['43',80',86',84',22',46',29',82',4',8',97',74',71',94',11',77',13',18',36',88',范围为100。@user1250201对了,我做了一些测试,并用一个新的解决方案更新了答案。感谢Sebastian的所有评论(也在其他帖子中)。我试过你的方法,但我不太擅长,所以我成功地尝试了你的所有建议。尽管如此,我还是觉得我的老方法是最快的方法。(它在5分钟内完成了+-30377个URL,直到我收到“错误:无法启动新线程”。
for n in xrange(1, 1000):
thread = threading.Thread(target=crawl)
thread.name = n
thread.start()
threads.append(thread)