浅谈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)
相关文章