接着上一篇

cprint 模块


Python内置的 print 函数可以输出任何类型的数据,但有时候输出的内容不够简洁、美观,难以直观地了解程序运行状态。cprint 库就是为了解决这个问题而生的,它可以让Python输出更简洁、更美观。
cprint 库是一个基于装饰器实现的工具,它可以让Python输出更简洁、更美观。cprint库实际上是一个只有一个函数的库,这个函数叫做 cprint,它可以接受多个参数,其中第一个参数是要输出的内容,其他参数是用于设置输出样式的。cprint函数会将第一个参数输出到控制台,并根据其他参数设置输出样式。
如下演示中,可以看到使用非常的简单

从0到1—POC编写基础篇(四)-LMLPHP

pyfiglet 模块

pyfiglet 是一个Python库,用于将普通文本转换为具有艺术感的ASCII字符艺术。它允许你将文本转换为各种独特的字体样式,创建令人惊叹的文本艺术。这个库的名字来源于 "figlet",这是一个用于生成ASCII艺术的程序。
使用方法
1导入库: 首先,你需要导入 pyfiglet 库。

import pyfiglet

2选择字体样式:pyfiglet 支持许多不同的字体样式。你可以从 这里 查看一些可用的字体样式示例。选择一个你喜欢的样式,将其名称作为参数传递给 figlet_format() 函数。

样式链接:http://www.figlet.org/examples.html

从0到1—POC编写基础篇(四)-LMLPHP

3生成ASCII艺术: 使用 figlet_format() 函数将普通文本转换为ASCII艺术。

text = "Hello, ASCII Art!"
font = "slant"  # 选择一个字体样式

ascii_art = pyfiglet.figlet_format(text, font=font)

4输出ASCII艺术: 使用 print() 函数将生成的ASCII艺术文本输出到终端。

print(ascii_art)
import pyfiglet

text = "Beret-SEC"
font = "slant"

ascii_art = pyfiglet.figlet_format(text, font)
print(ascii_art)

从0到1—POC编写基础篇(四)-LMLPHP在线生成连接:

http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20

增加颜色输出
pyfiglet 生成的 ASCII 艺术文本本身并不支持直接设置颜色。然而,你可以在生成的 ASCII 艺术文本的周围使用 ANSI 转义序列来设置颜色,从而实现在终端中的彩色输出。

text = "Color Test"

for color_code in range(256):
    colored_ascii_art = f"\033[38;5;{color_code}m{text}\033[0m"
    print("颜色编码%d: %s" % (color_code, colored_ascii_art))

text = "Beret-SEC"
font = "slant"
color = "10"  # ANSI颜色代码,10代表绿色

ascii_art = pyfiglet.figlet_format(text, font)
ascii_art = f"\033[38;5;{color}m{ascii_art}\033[0m"
print(ascii_art)

从0到1—POC编写基础篇(四)-LMLPHP

在 Windows 的命令提示符 (cmd) 终端下,ANSI 转义序列默认是被禁用的,因此无法直接在 cmd 中实现彩色输出。
要在 Windows 的 cmd 终端中实现彩色输出,你可以考虑使用 colorama 库。colorama 库允许你在 Windows 终端中使用 ANSI 转义序列来实现颜色和样式的输出。以下是一个使用 colorama 实现彩色输出的示例:
首先,你需要安装 colorama 库:

pip install colorama

然后,在 Python 脚本中使用以下代码:

import pyfiglet
from colorama import init, Fore, Back, Style

# 初始化 colorama 库
init()

text = "BERET-SEC"
font = "big"

ascii_art = pyfiglet.figlet_format(text, font=font)

# 使用 colorama 设置文本颜色为红色,背景颜色为黄色
colored_ascii_art = f"{Fore.RED}{Back.BLACK}{ascii_art}{Style.RESET_ALL}"

print(colored_ascii_art)

从0到1—POC编写基础篇(四)-LMLPHP

colorama 模块


colorama 是一个 Python 库,用于在 Windows 终端下使用 ANSI 转义序列来实现彩色文本和样式输出。以下是使用 colorama 库的基本方法:
1安装 colorama 库: 在使用 colorama 之前,你需要先安装它。你可以使用以下命令来安装:

bashCopy code
pip install colorama

导入并初始化 colorama 库: 在你的代码中导入 colorama 并进行初始化,以便启用 ANSI 转义序列的使用:

from colorama import init
init()

3使用 Fore、Back 和 Style 类来设置颜色和样式: colorama 提供了三个类,分别用于设置文本颜色、背景颜色和文本样式。以下是它们的基本用法:
○Fore:用于设置文本颜色
○Back:用于设置背景颜色
○Style:用于设置文本样式
4例如,Fore.RED 表示设置文本颜色为红色,Back.YELLOW 表示设置背景颜色为黄色,Style.RESET_ALL 表示重置样式设置。

pythonCopy code
from colorama import Fore, Back, Style

print(f"{Fore.RED}Red Text{Style.RESET_ALL}")
print(f"{Back.BLUE}Blue Background{Style.RESET_ALL}")
print(f"{Style.BRIGHT}Bright Text{Style.RESET_ALL}")

5重置颜色和样式: 使用 Style.RESET_ALL 可以重置颜色和样式设置,确保后续输出不受之前的设置影响。

pythonCopy code
from colorama import Fore, Back, Style

print(f"{Fore.RED}Red Text{Style.RESET_ALL} Normal Text")
print(f"{Back.BLUE}Blue Background{Style.RESET_ALL} Normal Background")

通过结合 colorama 和 pyfiglet,你可以在 Windows 终端中实现彩色的 pyfiglet ASCII 艺术输出,就像前面的示例代码所展示的一样。

from colorama import Fore

def main():
    print(Fore.RED + "这是红色的文本" + Fore.RESET)
    print(Fore.GREEN + "这是绿色的文本" + Fore.RESET)
    print(Fore.BLUE + "这是蓝色的文本" + Fore.RESET)
    print(Fore.YELLOW + "这是黄色的文本" + Fore.RESET)
    print(Fore.MAGENTA + "这是洋红色的文本" + Fore.RESET)
    print(Fore.CYAN + "这是青色的文本" + Fore.RESET)

if __name__ == "__main__":
    main()

从0到1—POC编写基础篇(四)-LMLPHP

threading 模块


参考链接:https://www.cnblogs.com/BaiJilang/p/15654849.html
threading库是python的线程模型,利用threading库我们可以轻松实现多线程任务。
关于线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。同一个进程内的多个线程可以并发执行,分享进程的资源。
在Python中,我们可以使用threading模块创建和管理线程。以下是一个创建线程的例子:

import threading

def print_numbers():
    for i in range(10):
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        print(letter)

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

在这个例子中,我们创建了两个线程:thread1和thread2。thread1的任务是打印数字0到9,thread2的任务是打印字母'a'到'j'。 我们使用threading.Thread类创建了两个线程对象,并指定了每个线程的目标函数。然后,我们调用了start方法来启动线程。 join方法用于等待线程结束。这是阻塞调用,也就是说,调用join方法的线程(在这个例子中是主线程)会被阻塞,直到被调用join方法的线程(在这个例子中是thread1和thread2)结束。
线程同步
在多线程环境中,多个线程可能需要共享一些资源。例如,多个线程可能需要写入同一个文件或修改同一个内存位置。这可能会引发所谓的竞态条件,其中一个线程的操作可能会影响其他线程的结果。 为了避免竞态条件,我们需要进行线程同步。Python的threading模块提供了多种线程同步的工具,包括锁(Lock)、条件(Condition)、事件(Event)、信号量(Semaphore)等。以下是一个使用锁进行线程同步的例子:

import threading

lock = threading.Lock()
counter = 0

def increase_counter():
    global counter
    with lock:
        counter += 1
        print(counter)

threads = []
for _ in range(10):
    thread = threading.Thread(target=increase_counter)
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

在这个例子中,我们创建了10个线程,每个线程都会增加共享变量counter的值。为了避免竞态条件,我们使用了一个锁来保护对counter的修改。只有获得了锁的线程才能修改counter,其他试图修改counter的线程将被阻塞,直到锁被释放。 with lock:语句用于自动获取和释放锁。当进入with语句时,锁被自动获取;当退出with语句时,锁被自动释放。这确保了即使在发生异常的情况下,锁也能被正确释放。


Pool 模块

multiprocessing.dummy 模块是 multiprocessing 模块的子模块之一,它提供了一个简化版的多线程 API,允许你使用多线程而不是多进程来执行任务。from multiprocessing.dummy import Pool 语句允许你从 multiprocessing.dummy 模块中导入 Pool 类,以便创建一个线程池。
以下是一个示例,展示如何使用 from multiprocessing.dummy import Pool 来创建一个线程池并执行多线程任务:

pythonCopy code
from multiprocessing.dummy import Pool
import time

def task(n):
    # 模拟一个耗时任务
    time.sleep(1)
    return n * n

def main():
    # 创建一个包含2个线程的线程池
    pool = Pool(2)

    # 创建一个任务列表
    tasks = [1, 2, 3, 4, 5]

    # 使用线程池并行执行任务
    results = pool.map(task, tasks)

    # 关闭线程池
    pool.close()
    pool.join()

    print("任务结果:", results)

if __name__ == "__main__":
    main()

在这个示例中,我们首先从 multiprocessing.dummy 模块中导入 Pool 类。然后,我们创建了一个包含2个线程的线程池。
接着,我们定义了一个 task 函数,它模拟一个耗时任务,接受一个参数并返回该参数的平方。
然后,我们创建了一个任务列表 tasks,包含了要执行的任务。
使用线程池的 map 方法,我们并行执行了任务,并等待所有任务完成。
最后,我们关闭了线程池,并打印了任务的结果。
请注意,multiprocessing.dummy 的用法与 multiprocessing 模块的用法非常相似,但在多线程环境中运行,适用于不需要多进程的多任务处理。


ThreadPoolExecutor 模块

ThreadPoolExecutor 是 Python 标准库 concurrent.futures 模块中的一个类,用于创建线程池以进行并发执行任务。它提供了一种方便的方式来管理线程,使您能够轻松地并行执行多个任务,而无需手动创建和管理线程。
以下是 ThreadPoolExecutor 的主要特点和用法:
1创建线程池:

from concurrent.futures import ThreadPoolExecutor

# 创建一个具有默认线程数的线程池
with ThreadPoolExecutor() as executor:
    # 在这里执行任务

默认情况下,线程池会使用与系统 CPU 核心数相当的线程。
2执行任务:使用 executor.submit() 或 executor.map() 方法来提交任务给线程池。
○executor.submit(fn, *args, **kwargs):将函数 fn 以及其参数 args 和关键字参数 kwargs 提交给线程池,并返回一个 Future 对象,用于获取任务的结果。
○executor.map(fn, *iterables, timeout=None, chunksize=1):将函数 fn 应用于可迭代对象 iterables 中的每个元素,返回一个生成器,可用于获取结果。
3获取任务结果:使用 Future 对象的 result() 方法来获取任务的结果。可以等待任务完成,然后获取结果。

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

result = future.result() # 阻塞直到任务完成并返回结果

4异常处理:使用 Future 对象的 exception() 方法来处理任务执行期间可能引发的异常。

future = executor.submit(some_function, arg1, arg2)
try:
    result = future.result()
except Exception as e:
    print(f"An exception occurred: {e}")

5关闭线程池:使用 with 语句可以确保在线程池使用完成后自动关闭,释放资源。

with ThreadPoolExecutor() as executor:
    # 执行任务
# 在此处线程池已关闭

ThreadPoolExecutor 是在并发编程中非常有用的工具,它简化了多线程应用程序的开发和管理,可以提高程序的性能和效率。但要小心,过多的线程可能会导致资源竞争和性能下降,因此需要根据具体情况合理选择线程数量。

04-25 20:46