浅谈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中的元祖(Tuple)和字典(Dict)

    元祖(Tuple)和字典(Dict)是Python中常用的数据类型,它们用于存储和操作数据。下面就来详细讲解一下。 元祖(Tuple) 元祖是一个不可变的序列,类似于列表(List),但元祖中的元素是不可改变的。元祖和列表都可以存储多个元素,但元祖的元素是用小括号括起来的,而列表则是用方括号。 创建元祖 元祖可以使用小括号创建,也可以使用tuple()函数来…

    python 2023年5月13日
    00
  • 对python列表里的字典元素去重方法详解

    下面是“对Python列表里的字典元素去重方法详解”的完整攻略。 简介 在Python中,列表是常见的数据类型之一,而字典是另一种常用的数据类型。有时,我们需要将列表中的字典元素去重,本篇文章就为大家讲述几种方法来实现。 方法一:利用 set 和 frozenset 首先我们可以将列表中的字典元素转为不可变的集合(frozenset),然后再使用set去重。…

    python 2023年5月13日
    00
  • Python里字典的基本用法(包括嵌套字典)

    现在我将为你详细讲解Python中字典的基本用法,包括嵌套字典,以下是详细攻略。 字典的基本用法 字典(dictionary)是 python3 中的一个重要数据类型,在字典中,每个数据都是由一个键和对应的值所组成的键值对。 创建字典 我们可以使用一对大括号来创建一个空字典,也可以在大括号中使用键值对的形式来创建字典。 # 创建空字典 dict1 = {} …

    python 2023年5月13日
    00
  • python爬虫中PhantomJS加载页面的实例方法

    本攻略将介绍如何在Python爬虫中使用PhantomJS加载页面。PhantomJS是一个无界面的浏览器,可以模拟用户在浏览器中的操作,如点击、滚动、输入等。我们将使用selenium库和PhantomJS驱动程序来实现这一功能。我们将提供两个示例代码,分别用于加载单个页面和多个页面。 安装所需库 在开始前,我们需要安装selenium库和PhantomJ…

    python 2023年5月15日
    00
  • Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

    Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解 什么是PyAutoGUI模块 PyAutoGUI是一款用于控制鼠标和键盘的Python模块。它可以在Windows、macOS和Linux上工作,实现的任务包括单击、双击、拖动、按键、松开按键等等。在自动化测试、GUI自动化、脚本测试等领域都有广泛的应用。 安装PyAutoGUI 可以在命…

    python 2023年5月19日
    00
  • Python calendar模块详情

    Python calendar模块是一个处理日期的标准库,它可以帮助我们快速地生成各种格式的日历,主要包括以下几个函数: calendar模块的函数 calendar.calendar(year, w=2, l=1, c=6) year:要显示的年份; w:每个日期之间的空格宽度,默认为2; l:每周所占的行数,默认为1; c:每月之间的间隔字符数,默认为6…

    python 2023年5月14日
    00
  • 如何在Python中查询Redis数据库中的数据?

    以下是在Python中查询Redis数据库中的数据的完整使用攻略。 使用Redis数据库的前提条件 在使用Python连接Redis数据库之前,需要确保已经安装Redis数据库,并已经创建使用的数据库,同时需要安装Python的驱动程序,例如redis。 步骤1:导入模块 在Python中使用redis模块连接Redis数据库。以下是导入redis模块的基本…

    python 2023年5月12日
    00
  • 关于使用OpenCsv导入大数据量报错的问题

    使用OpenCsv导入大数据量时,可能会遇到报错,具体解决方法如下: 问题描述 在使用OpenCsv导入大数据量(比如几十万行)时,可能会遇到以下报错信息: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 该报错信息表示Java堆内存空间溢出,导…

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