Python线程/线程实现

时间:2016-07-29 14:02:26

标签: python multithreading

我一直在努力尝试使用线程脚本。它最终将成为一个网络刮板,希望它比我之前制作的原始线性刮擦脚本快一点。

阅读并播放一些示例代码后数小时。我仍然不确定在实施过程中哪些被认为是正确的。

目前我有以下代码,我一直在玩:

import {DomSanitizationService, SafeHtml} from '@angular/platform-browser';

...

constructor(
    private sanitizer: DomSanitizationService,
    ...
){}

gcsesearch: SafeHtml;

ngOnInit() {
    this.gcsesearch = this.sanitizer.bypassSecurityTrustHtml("<gcse:search></gcse:search>");

    var cx = '016820916711928902111:qw0kgpuhihm';
    var gcse = document.createElement('script');
    gcse.type = 'text/javascript';
    gcse.async = true;
    gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(gcse, s);
}

我的想法是我在test.txt文件中有一个URL列表。我打开文件并将所有URL放入队列中。从那里我得到10个线程从队列中拉出来并抓取一个网页,或者在这个例子中只打印出拉出的线。

一旦功能完成,我删除一个'工作线程',然后换一个新工作线程直到队列为空。

在我的真实世界实现中,我将不得不从我的函数擦除中获取数据并将其写入.csv文件。但是,现在我只是想了解如何正确实现线程。

我见过类似上面使用'Thread'的类似例子......我也看过使用继承类的'threading'示例。我只想知道我应该使用什么以及管理它的正确方法。

在这里轻松我,我只是一个尝试理解线程的初学者......是的,我知道它会变得非常复杂。但是,我认为这应该很容易第一次尝试......

1 个答案:

答案 0 :(得分:2)

在Python 2.x上multiprocessing.dummy(使用线程)是一个很好的选择,因为它易于使用(也可以在Python 3.x中使用)

如果您发现抓取是CPU限制的并且您有多个CPU核心,这样您就可以非常简单地切换到真正的multiprocessing可能获得更大的加速。

(由于performance optimization,Python通常不会从具有多个进程的线程的多个CPU中获利 - 您必须自己找出在您的情况下更快的内容)

使用mutliprocessing.dummy可以做到

from multiprocessing.dummy import Pool
# from multiprocessing import Pool # if you want to use more cpus

def scrape(url):
    data = {"sorted": sorted(url)} # normally you would do something more interesting
    return (url, data)

urls=[]
threads = 10

if __name__=="__main__":
    with open('test.txt') as in_file:       
        urls.extend(in_file) # lines

    p=Pool(threads)
    results=list(p.imap_unordered(scrape,urls))
    p.close()
    print results # normally you would process your results here

在Python 3.x上,concurrent.futures可能是更好的选择。