Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python处理多线程的最佳方法是什么

Python处理多线程的最佳方法是什么
EN

Stack Overflow用户
提问于 2015-02-03 20:38:58
回答 2查看 1.1K关注 0票数 0

因为我的scaper运行很慢(一次一个页面),所以我试着使用线程来让它工作得更快。我有一个抓取(网站)函数,它接受一个要抓取的网站,所以我可以很容易地创建每个线程并在每个线程上调用start()。

现在,我想实现一个num_threads变量,它是我希望同时运行的线程数。处理这些多线程的最佳方式是什么?

例如:假设num_threads =5,我的目标是启动5个线程,然后抓取列表中的前5个网站并抓取它们,然后如果线程#3完成,它将立即抓取列表中的第6个网站抓取,而不是等到其他线程结束。

有什么关于如何处理它的建议吗?谢谢

EN

回答 2

Stack Overflow用户

发布于 2015-02-03 20:46:20

那得看情况。

如果您的代码大部分时间都在等待网络操作(很可能是在web抓取应用程序中),那么线程是合适的。实现线程池的最好方法是在3.4中使用concurrent.futures。如果做不到这一点,您可以创建一个threading.Queue对象并将每个线程编写为一个无限循环,该循环使用队列中的工作对象并对其进行处理。

如果您的代码在下载数据后大部分时间都在处理数据,那么由于GIL的存在,线程是无用的。concurrent.futures提供了对进程并发的支持,但同样只能在3.4+中工作。对于较老的Python,请使用multiprocessing。它提供了一种Pool类型,可以简化创建进程池的过程。

您应该分析您的代码(使用cProfile),以确定您正在经历这两种情况中的哪一种。

票数 0
EN

Stack Overflow用户

发布于 2015-02-03 20:48:09

如果您使用的是Python3,请查看concurrent.futures.ThreadPoolExecutor

从文档ThreadPoolExecutor Example中提取的示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']

# Retrieve a single page and report the url and contents
def load_url(url, timeout):
    conn = urllib.request.urlopen(url, timeout=timeout)
    return conn.readall()

# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))

如果你使用的是Python 2,有一个可用的后端口:

ThreadPoolExecutor Example

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from concurrent import futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']

def load_url(url, timeout):
    return urllib.request.urlopen(url, timeout=timeout).read()

with futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_url = dict((executor.submit(load_url, url, 60), url)
                         for url in URLS)

    for future in futures.as_completed(future_to_url):
        url = future_to_url[future]
        if future.exception() is not None:
            print('%r generated an exception: %s' % (url,
                                                     future.exception()))
        else:
            print('%r page is %d bytes' % (url, len(future.result())))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28308285

复制
相关文章
EMLOG通过不同域名使用不同的模板
只在emlog根目录的index.php简单修改就能实现,也可以做多用户二级域名调用不同的模板。当然也可以修改模板不同域名显示不同用户的文章。 $templet=Option::get('nonce_templet'); $the_host = $_SERVER['HTTP_HOST']; if ($the_host=='i.isiyuan.net') {////判断域名或者浏览器UA使用不同的前台模板 $templet='pink';//前台模板名 } define('TEMPLAT
Youngxj
2018/06/06
2.1K0
我是如何通过IPC连接关掉老师电脑的
net use h ipc$ 密码 user用户名 直接登陆后映射对方C:到本地为H
勤奋的思远
2021/03/29
2K0
我是如何通过IPC连接关掉老师电脑的
Git-合并两个不同的仓库
背景:由于拆分微前端,需要将最新代码合并到已经拆分的微前端项目,即需要将 2 个项目合并。 1.git 合并两个不同的仓库必备知识 1>.列出本地已经存在的分支 git branch 2>.查看当前 git 关联的远程仓库 git remote -v 3>.解除当前仓库关联的远程仓库 git remote remove origin //origin 远程分支别名 4>.git 同时关联多个远程仓库 //当前默认仓库别名为origin git remote add origin http://km-
leader755
2022/09/29
2.4K0
Linux的IPC命令
进程间通信有如下的目的:1、数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;2、共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到;3、通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情;4、资源共享,多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制;5、进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
大江小浪
2018/07/25
3.2K0
Linux的IPC命令
js筛选两个数组不同的元素方法
现在有两个数组array1和array2是我们筛选的对象 let list= []; list = this.array1.filter(item=>{ return array2.indexOf(item) == -1 }); 这样list就会返回两个数组中不同的元素重新组合成数组list list中的每一个元素就是array1和array2中所有不相同的元素
安德玛
2022/03/06
5.2K0
ABAP 取两个内表的交集 比较两个内表的不同
SAP自带的函数: CTVB_COMPARE_TABLES和BKK_COMPARE_TABLES; 似乎可以比较两个内表,得出第二个内表不同于第一个内表的部分(新增/删除了那些部分) 但是,具体的使用,还请有经验的朋友不吝赐教啊! 因为,我在测试数据时,发现这两个函数的效果不那么简单。 如果上述函数确实可以,提取两个内表不同部分,则我可以据此做两次比较,得到两个内表的交集。 所以,我先用另外一种方式解决了-自己写了一个提取两个内表交集的函数,供大家检阅: *" IMPORTING *" VALUE(ITAB1) TYPE INDEX TABLE *" VALUE(ITAB2) TYPE INDEX TABLE *" EXPORTING *" VALUE(ITABSAME) TYPE INDEX TABLE *"---------------------------------------------------------------------- field-symbols: <S1>, <S2>. data: L1 type i, L2 type i. assign local copy of initial line of: ITAB1 to <S1>, ITAB2 to <S2>. describe: table ITAB1 lines L1, table ITAB2 lines L2. "对记录行数少的内表,执行第一层循环; "在第二层循环中,找到对应记录,即可追加到结果内表; "同时退出第二层循环,继续执行第一层循环的下一行 IF L1 <= L2. LOOP AT ITAB1 INTO <S1>. LOOP AT ITAB2 INTO <S2>. IF <S1> EQ <S2>. APPEND <S1> TO ITABSAME. EXIT. ENDIF. ENDLOOP. ENDLOOP. ELSE. LOOP AT ITAB2 INTO <S2>. LOOP AT ITAB1 INTO <S1>. IF <S1> EQ <S2>. APPEND <S2> TO ITABSAME. EXIT. ENDIF. ENDLOOP. ENDLOOP. ENDIF. ENDFUNCTION. 另一个问题,想请教大家,在上面代码里,第二层循环是为了找出,第一层循环的当前记录,在第二个内表里是否存在;
matinal
2020/11/26
3.1K0
Android中的IPC方式
四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。
见得乐
2022/07/20
1.4K0
Android中的IPC方式
python 快速比较两个文件的不同
import difflib a = open('./1.txt', 'U').readlines() b = open('./2.txt', 'U').readlines() diff = difflib.ndiff(a, b) print(diff) for i in diff: print(i) # if i.startswith('+'): # print(i) #or print(set(b)-set(a))
周小董
2019/03/25
3.4K0
System|IPC|Rethinking IPC
IPC,进程间通信,是打破地址空间隔离的必经之路。本文按照个人理解对于IPC进行了一些分类与整理。
朝闻君
2021/11/22
7840
System|IPC|Rethinking IPC
怎么提取两个单元格里不同的内容?
大海:很简单,对“文本1“删除(Text.Remove)”文本2“的内容(Text.ToList)即可,如下所示:
大海Power
2021/08/30
2.1K0
echarts- 通过数据的大小展示不同的颜色
通过数据判断颜色.png ---- ---- itemStyle:{ normal:{ /// 通过params.value拿到对应的data里面的数据 color:function(params){ if(params.value >0 && params.value <99){
用户4344670
2019/08/28
2.4K0
echarts- 通过数据的大小展示不同的颜色
Windows的IPC$共享学习
乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。
乌鸦安全
2022/12/19
5.4K0
Windows的IPC$共享学习
linux环境中,两个不同网段的机器互通
host2 双网卡 eth0 172.24.100.14/16   eth1 192.168.122.214/24
用户1685462
2021/07/27
2.9K0
聊聊不同集群的微服务如何通过feign调用
后因业务改造需要,该项目需要将服务A部署到另外一个集群,但服务A仍然需要能调用到服务B,调用关系如下图
lyb-geek
2023/07/04
3550
聊聊不同集群的微服务如何通过feign调用
一个ip, 两个域名, 两个ssl, 访问多个不同的项目
在前面一篇中说过, 入了好几个坑. 后来使用了nginx+tomcat配置的方式. 终于成功了. 因为头一次使用nginx, 不知道具体怎么操作, 于是我在操作的时候, 按照以下几个步骤执行的:
用户7798898
2020/09/27
4K0
一个ip, 两个域名, 两个ssl, 访问多个不同的项目
聊聊不同集群的微服务如何通过feign调用
后因业务改造需要,该项目需要将服务A部署到另外一个集群,但服务A仍然需要能调用到服务B,调用关系如下图
lyb-geek
2023/09/07
3020
聊聊不同集群的微服务如何通过feign调用
Nginx学习日志(二)通过反向代理将不同域名映射到不同的端口
由于自己进行学习,所以只买了一台服务器,但是想弄多个项目部署在同一台机器上,通过不同的域名访问不同的项目。例如: 输入 www.xxx.com 访问的是服务器上 8080 端口的项目 输入 www.yyy.com 访问的是服务器上 8081 端口的项目 最后决定通过 Nginx 反向带来实现。
海加尔金鹰
2020/06/09
2.9K0
【C/C++教学】浅谈交换两个数的不同实现方法
在小编辛辛苦苦撸了一个月C语言之后,屁颠屁颠跑去老师面前想装个B。老师说哎那你说说怎么实现两个数的交换?这TM不太简单了嘛。当小编把代码给老师看的时候,老师蛋蛋一笑,眼神里充满了关爱,然后来了一句:这么low的代码都能写出来,你心里难道没有一点逼数嘛?
短短的路走走停停
2019/05/14
2.1K0
通过SSH使用Rsync同步两个VPS的文件
2、使用SSH登录B服务器 创建authorized_keys文件,存储A服务器的公共SSH key。如果没有authorized_keys文件,则创建此文件。
用户8851537
2021/07/23
7070
通过canvas计算任意两个颜色的插值
通过canvas可以协助我们做很多颜色计算的辅助,比如颜色转换,渐变颜色计算。本文着重讲解渐变计算颜色的插值计算。
用户3158888
2020/07/15
1K0

相似问题

不同IPC机制的用法

20

为不同的系统使用IPC

31

通过linux消息的简单IPC

14

通过ipc中断冻结的Q进程

110

如何在android中通过aidl和IPC在两个不同的应用程序之间进行通信?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文