python实现多线程采集的2个代码例子

yizhihongxing

下面是详细的攻略:

Python实现多线程采集

前言

对于一些需要收集数据的任务,并发的采集方式无疑是对效率的一大提升。Python语言提供了多线程编程的支持,本文将会介绍两种使用Python实现多线程采集的方式并提供相应的代码。

代码实现

代码一

第一种实现方式相对来说比较简单理解,我们可以直接使用Thread类来创建新的线程并运行。

import threading
import requests

def main():
    urls = ["http://example.com/", 
            "http://example.com/news", 
            "http://example.com/about", 
            "http://example.com/contact",
            "http://example.com/sitemap",
            "http://example.com/blog",
            "http://example.com/jobs",
            "http://example.com/feedback"]

    threads = []

    for url in urls:
        t = threading.Thread(target=fetch_url, args=(url,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

def fetch_url(url):
    print("Fetching {0}".format(url))
    try:
        r = requests.get(url)
        print("{0}: {1}".format(url, r.status_code))
    except requests.exceptions.RequestException as e:
        print("{0}: {1}".format(url, e))

使用上述代码,简单来说,我们首先定义了一个列表urls,并在遍历该列表的过程中,创建了多个线程,每个线程都调用了fetch_url函数,并传入了当前的URL。接着,我们在主线程内通过join等待其他线程的结束。

代码二

另外一种实现方式相对来说更加高级,可以同时限制线程数量来进一步提升效率,我们可以使用Python的线程池来实现。

import concurrent.futures
import requests

def main():
    urls = ["http://example.com/", 
            "http://example.com/news", 
            "http://example.com/about", 
            "http://example.com/contact",
            "http://example.com/sitemap",
            "http://example.com/blog",
            "http://example.com/jobs",
            "http://example.com/feedback"]

    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        future_to_url = {executor.submit(fetch_url, url): url for url in urls}
        for future in concurrent.futures.as_completed(future_to_url):
            url = future_to_url[future]
            try:
                data = future.result()
                print("{0}: {1}".format(url, data))
            except Exception as exc:
                print("{0}: {1}".format(url, exc))

def fetch_url(url):
    print("Fetching {0}".format(url))
    try:
        r = requests.get(url)
        return r.status_code
    except requests.exceptions.RequestException as e:
        return str(e)

使用以上代码,我们可以看到,在主函数内,我们首先定义了一个URL列表urls,并使用线程池ThreadPoolExecutor创建了一个最大线程数为5的线程池。随后,我们在使用submit方法向线程池提交任务时,还为每个任务使用了一个dict来存储其对应的URL地址,方便我们后续的输出。最后,我们在对future进行as_completed迭代的过程中获取了每个任务返回的结果。

总结

以上两种多线程采集Python代码的方式并不是唯一的选择,而是较为常用且简便的方式之一。通过合理使用多线程的方式来提升程序的效率,是Python程序员们需要重点考虑的一项工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现多线程采集的2个代码例子 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python实现视频裁剪的示例代码

    下面我就来为你详细讲解“Python实现视频裁剪的示例代码”的完整攻略。 简介 首先来了解一下Python实现视频裁剪需要用到的几个关键概念。 OpenCV库 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效,因此非常适合于移动端应用的开发。此外,OpenCV也具…

    python 2023年6月3日
    00
  • Python如何破解压缩包密码

    Python如何破解压缩包密码攻略 简介 在日常使用电脑过程中,经常会遇到需要解压缩密码保护的文件的情况。如果已知密码,解压缩是比较简单的,但如果没有密码,我们可以尝试使用Python编写破解程序来尝试破解密码,提高效率。 原理 破解压缩包的密码一般使用暴力破解的方法,即从密码字典中枚举所有可能的密码,直到找到正确的密码。 常用的破解压缩包密码的Python…

    python 2023年6月3日
    00
  • Python Tkinter Gui运行不卡顿(解决多线程解决界面卡死问题)

    Python Tkinter Gui在运行过程中,会因为一些操作阻塞主线程,导致界面卡顿或卡死的问题。针对这个问题,我们可以采用多线程的方式解决。 解决过程如下: 1.创建子线程 我们可以在Tkinter的主线程中创建一个子线程,将需要耗时操作的函数放到子线程中执行,从而避免阻塞主线程。下面是一个示例: import threading import tim…

    python 2023年5月19日
    00
  • Python中re模块:匹配开头/结尾(^/$)

    在 Python 中,re 模块提供了一些特殊字符来匹配字符串的开头和结尾。本文将详细介绍如何使用 re 模块来匹配字符串的开头和结尾,包括正则表达式的编写、re 模块的使用等。 匹配开头 在正则表达式中,^ 表示匹配字符串的开头。以下是一个匹配以字母 A 开头的字符串的正则表达式示例: import re text = "Apple is a f…

    python 2023年5月14日
    00
  • Python pip安装lxml出错的问题解决办法

    下面是详细讲解“Python pip安装lxml出错的问题解决办法”的完整攻略。 问题描述 在使用pip安装Python的lxml模块时,可能会遇到以下报错信息: Building wheels for collected packages: lxml Building wheel for lxml (setup.py) … error ERROR: C…

    python 2023年6月3日
    00
  • Python:在字符串列表中查找子字符串

    【问题标题】:Python: Find substring in list of stringPython:在字符串列表中查找子字符串 【发布时间】:2023-04-03 03:22:01 【问题描述】: 我有两个列表:songs 是歌曲名称列表,filenames 是通过运行 os.listdir() 生成的歌曲 MP3 文件列表。 songs = [‘T…

    Python开发 2023年4月8日
    00
  • python判断元素是否存在的实例方法

    当我们在使用Python开发程序时,常常需要判断一个元素是否存在。本文将详细介绍Python中判断元素是否存在的实例方法。 使用in关键字 Python中内置了一个关键字in,可以用来判断一个元素是否在列表、元组、字符串等数据类型中存在。in关键字的语法格式为: element in sequence 其中,element为需要判断的元素,sequence为…

    python 2023年6月6日
    00
  • 浅谈Python处理json字符串为什么不建议使用eval()

    下面是详细讲解: 为什么不建议使用eval()处理json字符串 在处理json字符串时,可能会想到使用Python内置的eval()函数快速地将json字符串转换为Python对象。但是,使用eval()函数存在着一些潜在的问题,下面我们逐一进行说明。 1. 安全性问题 首先,使用eval()函数需要非常小心,因为它不仅仅能够将json字符串转换为Pyth…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部