python中的线程不会并行发生

发布于 2021-01-29 18:19:27

我正在使用urllib2进行数据抓取调用,但是每个调用大约需要1秒钟才能完成。我正在尝试测试是否可以将URL调用循环多线程化为具有不同偏移量的线程。

我现在使用update_items()方法执行此操作,其中第一个和第二个参数是循环的偏移量和限制:

import threading
t1 = threading.Thread(target=trade.update_items(1, 100))
t2 = threading.Thread(target=trade.update_items(101, 200))
t3 = threading.Thread(target=trade.update_items(201, 300))

t1.start()
t2.start()
t3.start()

#t1.join()
#t2.join()
#t3.join()

像代码一样,我试图对join()进行注释,以防止线程等待,但是看来我对这个库的想法是错误的。我将print()函数插入了update_items()方法中,很有趣,它表明它仍在串行例程中循环,而不是像我想要的那样在所有3个线程中并行循环。

我的正常抓取协议大约需要5个小时才能完成,并且数据量很小,但是HTTP调用总是需要一些时间。我想对该任务执行至少几次多线程处理,以将获取时间至少缩短到30-45分钟左右。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    要并行获取多个网址,一次最多限制20个连接:

    import urllib2
    from multiprocessing.dummy import Pool
    
    def generate_urls(): # generate some dummy urls
        for i in range(100):
            yield 'http://example.com?param=%d' % i
    
    def get_url(url):
        try: return url, urllib2.urlopen(url).read(), None
        except EnvironmentError as e:
             return url, None, e
    
    pool = Pool(20) # limit number of concurrent connections
    for url, result, error in pool.imap_unordered(get_url, generate_urls()):
        if error is None:
           print result,
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看