这里是关于“浅谈python多线程和队列管理shell程序”的完整攻略。
Python是一种高级编程语言,具有易学易用、灵活性高等特点。多线程和队列管理则是Python中的两个非常重要的概念。
多线程指的是在一个程序中同时运行多个线程,实现多个任务同时进行,提高程序的运行效率。Python提供了threading库,可以用来实现多线程的功能。
队列管理指的是通过Python中的queue库,对程序中的数据进行管理和分发。通常情况下,队列管理被用来实现多线程之间的通信和数据共享。
Python多线程和队列管理可以用来编写各种各样的程序,例如网络爬虫、图像处理、数据分析等。下面,我们通过两个简单的示例来说明多线程和队列管理的应用。
本示例通过多线程和队列管理,实现从指定的网址下载图片,并将下载成功的图片保存到本地磁盘。
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)
本示例通过队列管理,实现对多个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)