浅谈python多线程和队列管理shell程序

这里是关于“浅谈python多线程和队列管理shell程序”的完整攻略。

1. 什么是Python多线程和队列管理

Python是一种高级编程语言,具有易学易用、灵活性高等特点。多线程和队列管理则是Python中的两个非常重要的概念。

1.1 多线程

多线程指的是在一个程序中同时运行多个线程,实现多个任务同时进行,提高程序的运行效率。Python提供了threading库,可以用来实现多线程的功能。

1.2 队列管理

队列管理指的是通过Python中的queue库,对程序中的数据进行管理和分发。通常情况下,队列管理被用来实现多线程之间的通信和数据共享。

2. Python多线程和队列管理的应用

Python多线程和队列管理可以用来编写各种各样的程序,例如网络爬虫、图像处理、数据分析等。下面,我们通过两个简单的示例来说明多线程和队列管理的应用。

2.1 示例1:使用多线程和队列管理下载网络图片

本示例通过多线程和队列管理,实现从指定的网址下载图片,并将下载成功的图片保存到本地磁盘。

import urllib.request
import threading
import queue

# 定义图片下载函数
def download_pic(url, folder):
    try:
        # 从网络获取图片数据
        data = urllib.request.urlopen(url).read()
        # 构造本地文件名
        filename = url.split("/")[-1]
        filepath = folder + "/" + filename
        # 写入本地文件
        with open(filepath, "wb") as file:
            file.write(data)
            print("saved: ", filepath)
    except:
        print("fail: ", url)

# 定义多线程函数
def multi_thread(folder, urls, max_workers=10):
    # 创建一个队列,用来存放需要下载的图片url
    url_queue = queue.Queue()
    for url in urls:
        url_queue.put(url)

    # 创建多个线程,每个线程从队列中取出一个url进行下载
    for i in range(max_workers):
        t = threading.Thread(target=worker, args=(url_queue,folder))
        t.daemon = True
        t.start()

    # 等待队列中的url全部下载完成
    url_queue.join()

# 定义工作线程函数
def worker(url_queue, folder):
    while True:
        try:
            url = url_queue.get()
            download_pic(url, folder)
            url_queue.task_done()
        except queue.Empty:
            break

# 主函数
if __name__ == '__main__':
    # 测试数据,这里使用百度图片搜索“cute kitten”
    url_base = "https://image.baidu.com/search/down"
    url_params = "?tn=download&word=cute kitten&ie=utf-8&fr=detail&url=http%3A%2F%2Fphotocdn.sohu.com%2F20120112%2FImg331819276.jpg&thumburl=http%3A%2F%2Fimg1.imgtn.bdimg.com%2Fit%2Fu%3D3320514253%2C868799158%26fm%3D26%26gp%3D0.jpg"
    urls = [url_base+url_params]*3

    # 运行多线程程序
    folder = "./kitten"
    multi_thread(folder, urls, max_workers=3)

2.2 示例2:通过队列管理并行运行shell命令

本示例通过队列管理,实现对多个shell命令进行并行运行,并将运行结果写入文件。

import subprocess
import threading
import queue

# 定义shell命令运行函数
def run_cmd(cmd, output):
    try:
        # 运行shell命令并将结果写入文件
        with open(output, "wb") as file:
            subprocess.run(cmd, shell=True, check=True, stdout=file)
            print("finished: ", cmd)
    except:
        print("fail: ", cmd)

# 定义多线程函数
def multi_thread(cmds, outputs, max_workers=10):
    # 创建一个队列,用来存放需要运行的shell命令
    cmd_queue = queue.Queue()
    for cmd in cmds:
        cmd_queue.put(cmd)

    # 创建多个线程,每个线程从队列中取出一个shell命令进行运行
    for i in range(max_workers):
        t = threading.Thread(target=worker, args=(cmd_queue, outputs))
        t.daemon = True
        t.start()

    # 等待队列中的shell命令全部运行完成
    cmd_queue.join()

# 定义工作线程函数
def worker(cmd_queue, outputs):
    while True:
        try:
            cmd = cmd_queue.get()
            output = outputs[cmds.index(cmd)]
            run_cmd(cmd, output)
            cmd_queue.task_done()
        except queue.Empty:
            break

# 主函数
if __name__ == '__main__':
    # 测试数据,同时运行三个shell命令
    cmds = ["ls -la", "pwd", "whoami"]
    outputs = ["ls.txt", "pwd.txt", "whoami.txt"]

    # 运行多线程程序
    multi_thread(cmds, outputs, max_workers=3)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈python多线程和队列管理shell程序 - Python技术站

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

相关文章

  • 如何通过python检查文件是否被占用

    以下是关于如何通过 Python 检查文件是否被占用的完整攻略: 问题描述 在 Python 中,有时候我们需要检查文件是否被占用。本文详细介绍如何通过 Python 检查文件是否被占用。 解决方法 以下步骤解决 Python 检查文件是否被占用问题: 使用 os 模块检查文件是否存在。 可以使用 os 模块的 path.exists() 方法检文件是否存在…

    python 2023年5月13日
    00
  • Python脚本后台运行的五种方式

    现在我来详细讲解“Python脚本后台运行的五种方式”的完整攻略。 1. 使用nohup命令 nohup是一个常用的命令,可在远程服务器上运行命令行应用程序,并将输出重定向到文件nohup.out中。您可以使用以下命令将Python脚本在后台执行,无论是否注销SSH连接: nohup python script.py & 使用“&”符号在后台…

    python 2023年5月19日
    00
  • python requests 测试代理ip是否生效

    以下是关于使用Python requests测试代理IP是否生效的详细攻略: 使用Python requests测试代理IP是否生效 Python requests库支持使用代理IP发送HTTP请求。以下是使用Python requests测试代理IP是否生效的步骤: 获取代理IP 首先,需要获取一个可用的代理IP。可以从代理IP提供商处购买或免费获取代理I…

    python 2023年5月14日
    00
  • 浅谈Python 集合(set)类型的操作——并交差

    关于Python集合(set)类型的操作,我们涉及到比较常用的三个操作:并集、交集、差集。下面将针对这三个操作进行详细的讲解。 1. 操作一:并集 Python中,集合用{}或set()表示,当我们需要对两个集合进行合并操作时,可以使用并集操作。并集是一种去重后合并的操作,即将两个集合中的所有元素进行合并,并去除其中的重复元素。 示例一: set1 = {1…

    python 2023年5月13日
    00
  • python3 面向对象__类的内置属性与方法的实例代码

    Python 3 是一种面向对象编程的语言,这意味着你可以创建类和对象,并使用它们来管理数据和行为。类是对象的模板或蓝图,它定义了对象的属性和方法。Python 3 为类和对象提供了许多内置属性和方法,让你更方便地处理它们。 类的内置属性 Python 3 中的每个类都有一些内置属性,如下所示: __name__:表示类的名称 __module__:表示定义…

    python 2023年6月2日
    00
  • 教你怎么用python连接sql server

    以下是教你怎么用 Python 连接 SQL Server 的完整攻略: 准备工作 在 Windows 系统上安装 SQL Server 实例,并确保已创建一个数据库。 安装 SQL Server 的 Python 驱动程序 pyodbc。可以使用以下命令在命令行中安装: shell pip install pyodbc 打开 SQL Server 的 SQ…

    python 2023年5月20日
    00
  • jupyter notebook 自定义python解释器的过程详解

    下面我将详细讲解“jupyter notebook自定义python解释器的过程详解”。 1. 准备工作 首先需要确保已安装jupyter notebook,可以在命令行中输入以下命令检查是否安装: jupyter –version 如果命令能够顺利执行并输出版本信息,则说明已成功安装jupyter notebook。 然后需要安装ipykernel模块,…

    python 2023年5月20日
    00
  • python3爬虫中异步协程的用法

    在Python3爬虫中,异步协程是一种高效的方式来处理并发请求和I/O操作。本文将详细讲解Python3爬虫中异步协程的用法,包括使用asyncio库和aiohttp库两个示例。 使用asyncio库实现异步协程的示例 以下是一个示例,演示如何使用asyncio库实现异步协程: import asyncio async def fetch(url): asy…

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