当前位置: 首页 > 面试题库 >

python中的线程不会并行发生

方航
2023-03-14
问题内容

我正在使用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分钟左右。


问题答案:

要并行获取多个网址,一次最多限制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,


 类似资料:
  • 并发是什么?引用Rob Pike的经典描述: 并发是同一时间应对多件事情的能力 其实在我们身边就有很多并发的事情,比如一边上课,一边发短信;一边给小孩喂奶,一边看电视,只要你细心留意,就会发现许多类似的事。相应地,在软件的世界里,我们也会发现这样的事,比如一边写博客,一边听音乐;一边看网页,一边下载软件等等。显而易见这样会节约不少时间,干更多的事。然而一开始计算机系统并不能同时处理两件事,这明显满

  • 并行 理论上并行和语言并没有什么关系,所以在理论上的并行方式,都可以尝试用Rust来实现。本小节不会详细全面地介绍具体的并行理论知识,只介绍用Rust如何来实现相关的并行模式。 Rust的一大特点是,可以保证“线程安全”。而且,没有性能损失。更有意思的是,Rust编译器实际上只有Send Sync等基本抽象,而对“线程” “锁” “同步” 等基本的并行相关的概念一无所知,这些概念都是由库实现的。这

  • 本章讲解 Rust 中,并发,并行,多线程编程的相关知识。

  • 然后是数据报通道、pipelineFactory和Bootstrap: 在pipelineFactory中,getPipeline()添加自定义处理程序。 就像中所说的:UDP消息的多线程处理 然后我根据这些条目修改了一些代码。现在创建线程池的条件是: 和ExecutionHandler的pipelineFactory: getPipeline()添加处理程序,如所描述的: 但它们不同时处理。me

  • 问题内容: 似乎当我实例化12个Swing Worker线程时,前六个开始完成其任务,它完成,然后最后六个开始并完成。我要寻找的行为是所有12个线程同时开始工作并同时完成。 我有以下内容: myTask m将以25的增量从0-100递增进度条。我得到了奇怪的行为,前六个线程开始递增,以100结束,然后最后六个线程从0开始并递增并完成。 是否可以限制一个Swing Worker线程数量? 问题答案:

  • 同步 同步指的是线程之间的协作配合,以共同完成某个任务。在整个过程中,需要注意两个关键点:一是共享资源的访问, 二是访问资源的顺序。通过前面的介绍,我们已经知道了如何让多个线程访问共享资源,但并没介绍如何控制访问顺序,才不会出现错误。如果两个线程同时访问同一内存地址的数据,一个写,一个读,如果不加控制,写线程只写了一半,读线程就开始读,必然读到的数据是错误的,不可用的,从而造成程序错误,这就造成了