Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 螺纹参数_Python_Multithreading_Variables_Thread Sleep - Fatal编程技术网

Python 螺纹参数

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

我又问了一个问题。。又有问题了。希望找到更聪明、更了解这一点的人D

我现在遇到了线程问题,当打开范围为(11000)的线程URL时,我希望看到所有不同的URL。只有当我运行代码时,我才会得到很多双变量(可能是因为爬网速度太快)。不管怎样,这是我的代码:我试着看它在哪个线程,但我得到了双倍

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)