python中的线程不能使用urllib2同时执行

时间:2014-11-29 18:22:33

标签: python multithreading urllib2

您好我正在尝试在python中执行2个线程。这些线程使urllib2请求在不同的域上运行php文件,但是当我这样做时,只运行其中一个。我怎么能让他们两个都跑?感谢

import urllib2, threading
archivin=open("data.txt","r")


class hilo(threading.Thread):
    def __init__(self): 
        threading.Thread.__init__(self)

    def run(self):
        for x in archivin.readlines():
            try:
                url=urllib2.urlopen("http://www.mysite1.com/utils.php?data="+x.split(", ")[1])
            except:
                continue


class hilo2(threading.Thread):
    def run(self):
        for x in archivin.readlines():
            try:
                url2=urllib2.urlopen("http://www.mysite2.com/utils.php?data="+x.split(", ")[1])
            except:
                continue


mi_hilo1=hilo()
mi_hilo1.start()
mi_hilo2=hilo2()
mi_hilo2.start()

1 个答案:

答案 0 :(得分:0)

我认为问题不在于线程本身。

您正在两个位置读取同一archivin个文件的所有行而不“倒回”它。

如果我尝试两次读取文件,这就是我的电脑中发生的情况。

>>> f=open("virtuoso_hX2016.ini", 'r')
>>> f.tell()
0
>>> 
>>> [x for x in f.readlines()]
['[Database]\n',   
 'DatabaseFile='MaxDirtyBuffers=1333\n', 'SchedulerInterval=5\n', 
 'FreeTextBatchSize=1000\n', 'CheckpointInterval=10\n', 
 [ . . . ]
 'MinAutoCheckpointSize=200000\n', '\n', '[I18N]\n', 'XAnyNormalization=3\n']
>>> f.tell()
981
>>> [x for x in f.readlines()]
[]

如果你看到,第二个readlines返回一个空列表。那是因为第一次读取将virtuoso_hX2016文件偏移设置为文件的末尾(它“全部消耗”)。另外,请看第一个tell()电话?它说0因为文件偏移是“指向”到文件的开头。读取文件后,第二个tell()981,因为它指向文件的末尾(第一个读取“消耗”所有文件)

请参阅此seektell方法教程。

在您的特定情况下,我建议(如果文件的大小相当小)在启动线程之前读取文件内容并将内容作为参数传递,或者在每个线程{{{}内执行文件打开/读取1}}方法。