Python 多线程使用指南

引言

Python的concurrent.futures模块提供了一个ThreadPoolExecutor类,它可以创建一个线程池来并发地执行多个任务。这个指南将帮助您理解如何使用ThreadPoolExecutor来加速程序的执行。

安装

Python 3.2及之后的版本自带concurrent.futures模块,无需额外安装。只需使用import语句即可使用。

使用线程池执行器 ThreadPoolExecutor
创建线程池

from concurrent.futures import ThreadPoolExecutor

用指定的线程数初始化 ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=10)

max_workers是线程池中的线程数,通常取决于您的任务类型和系统的硬件资源。

提交任务

使用submit方法

submit()方法用于提交一个可调用对象以及它的参数到线程池。这会返回一个Future对象,代表异步执行的操作。

future = executor.submit(a_function, arg1, arg2)

使用map方法

map()方法用于同时提交多个任务到线程池,它会对各个任务的参数进行迭代。当迭代的对象提供了多个序列时,它们会并行地进行。

results = executor.map(a_function, iterable1, iterable2)

关闭线程池

可以使用with语句来自动管理线程池的生命周期:

with ThreadPoolExecutor(max_workers=10) as executor:
    # 在这个代码块中提交任务
    # ...

退出with代码块时,线程池自动关闭

如果不使用with语句,需要手动调用shutdown()方法:

executor.shutdown(wait=True)

wait参数表示是否等待所有线程完成任务。当设置为True,shutdown()会等待所有提交给线程池的未完成任务结束。

示例代码

以下是一个提交给线程池的任务的简单例子:

import concurrent.futures

def load_url(url, timeout):
    # 这里是加载网页的代码
    return url

urls = ["http://google.com", "http://example.com"] # 要加载的网页列表

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # 提交网页加载任务
    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)))

示例二

from concurrent.futures import ThreadPoolExecutor

def scrape_and_save_data(url, table_name, proxies):
	pass

def wrapper(url, table_name): 
	scrape_and_save_data(url, table_name, proxies)

with ThreadPoolExecutor(max_workers=NUM_WORKERS) as executor:
	executor.map(wrapper, urls.keys(), urls.values())

注意事项

多线程并非总是能提升程序性能,当任务是CPU密集型的,或者在全局解释器锁(GIL)的限制下,多线程性能可能不如预期。
选择合适的max_workers值对于优化程序至关重要。过多的线程可能会造成竞争,从而降低程序性能。
确保线程之间的同步和状态共享得当,以避免数据竞争和其他并发相关的问题。

总结

ThreadPoolExecutor是一个强大的库,它使得在Python中进行多任务并行处理变得容易。遵循本文档的指南,您应该能够有效地使用多线程来提升程序的性能。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油头Y7

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值