Python 多线程和多进程用法


1. Python 多进程

1.1 常见用法

multiprocessing 是 Python 标准库中的一个模块,用于在多核或多处理器环境中并行执行任务。它提供了一种便捷的方法来创建和管理多个进程,以实现并行计算。multiprocessing 模块的功能包括创建进程、进程间通信、进程同步、进程池、共享数据结构等。

下面是一些 multiprocessing 模块的常用功能和用法介绍:

1. 创建进程

你可以使用 multiprocessing.Process 类创建新的进程。目标函数可以接受参数并在进程中执行。

import multiprocessing

def worker_function(name):
    print(f"Hello from process {name}")

if __name__ == '__main__':
    # 创建进程
    process1 = multiprocessing.Process(target=worker_function, args=("Process 1",))
    process2 = multiprocessing.Process(target=worker_function, args=("Process 2",))

    # 启动进程
    process1.start()
    process2.start()

    # 等待进程完成
    process1.join()
    process2.join()

2. 进程池

multiprocessing.Pool 类提供了一种方式,可以在进程池中并行执行任务。

import multiprocessing

def square(x):
    return x * x

if __name__ == '__main__':
    # 创建进程池
    with multiprocessing.Pool(processes=4) as pool:
        # 并行执行任务
        results = pool.map(square, range(10))
        print(results)

3. 进程间通信

multiprocessing 提供了管道 (Pipe) 和队列 (Queue) 来实现进程间的通信。

示例代码:

import multiprocessing

def producer(pipe):
    # 通过管道发送数据
    pipe.send("Hello from producer")

def consumer(pipe):
    # 从管道接收数据
    message = pipe.recv()
    print(message)

if __name__ == '__main__':
    # 创建管道
    parent_pipe, child_pipe = multiprocessing.Pipe()
    
    # 创建进程
    p1 = multiprocessing.Process(target=producer, args=(child_pipe,))
    p2 = multiprocessing.Process(target=consumer, args=(parent_pipe,))
    
    # 启动进程
    p1.start()
    p2.start()
    
    # 等待进程完成
    p1.join()
    p2.join()

4. 进程同步

multiprocessing 提供了锁 (Lock)、条件变量 (Condition) 和信号量 (Semaphore) 等同步原语,以便在进程间进行同步。

示例代码:

import multiprocessing

def worker(lock, num):
    with lock:
        # 锁定后执行的操作
        print(f"Locked by process {num}")

if __name__ == '__main__':
    # 创建锁
    lock = multiprocessing.Lock()

    # 创建进程
    processes = []
    for i in range(3):
        process = multiprocessing.Process(target=worker, args=(lock, i))
        processes.append(process)

    # 启动进程
    for process in processes:
        process.start()

    # 等待所有进程完成
    for process in processes:
        process.join()

1.2 结合进度条显示

(1)列表作为参数

def square(x):
    return x * x

import multiprocessing
from tqdm import tqdm

iters = [1, 2, 3, 4]
pool = multiprocessing.Pool(processes = 5)
ret_list = [ret for ret in tqdm(pool.imap(func=square, iterable=iters), total=len(iters))]
pool.close()
pool.join()

(2)字典,需要转换成列表

def square(args):
	x, y = args
    return x * y

import multiprocessing
from tqdm import tqdm

dict_map = {"1": 1, "2": 2, "3": 3}
iters = [(k, v) for k, v in dict_map.items()]
pool = multiprocessing.Pool(processes = 5)
ret_list = [ret for ret in tqdm(pool.imap(func=square, iterable=iters), total=len(iters))]
pool.close()
pool.join()

2. Python 多线程

在 Python 中,多线程是一种并行执行多个任务的方法。threading 模块提供了多线程编程的支持。通过使用多线程,你可以并行执行多个任务,从而提高程序的效率,尤其是在 I/O 密集型任务中(例如网络请求、文件读写等)。多线程适合于 I/O 密集型任务,因为 Python 的全局解释器锁(GIL)会限制 CPU 密集型任务的并行执行。

2.1 常见用法

在 Python 中,threading 模块提供了多线程编程的基础。你可以通过创建 threading.Thread 对象来创建新的线程,并将目标函数和参数传递给线程。在创建和启动线程后,可以通过 join() 方法等待线程完成执行。

下面是一个示例,展示了多线程的基本用法:

import threading
import time

# 定义目标函数
def worker_function(name, sleep_time):
    print(f"Thread {name} starting")
    time.sleep(sleep_time)
    print(f"Thread {name} finishing")

if __name__ == '__main__':
    # 创建线程
    thread1 = threading.Thread(target=worker_function, args=("Thread 1", 2))
    thread2 = threading.Thread(target=worker_function, args=("Thread 2", 3))

    # 启动线程
    thread1.start()
    thread2.start()

    # 等待线程完成
    thread1.join()
    thread2.join()

    print("All threads finished.")

在这个示例中,我们定义了一个目标函数 worker_function,该函数接收线程的名字和睡眠时间作为参数。在 __name__ == '__main__' 中,我们创建两个线程,并将目标函数和参数传递给线程。启动线程后,我们使用 join() 方法等待线程完成。

1. 使用线程池

除了直接创建线程外,你还可以使用 concurrent.futures 模块中的 ThreadPoolExecutor 来创建线程池,并执行任务。线程池可以方便地管理多个线程,并发执行多个任务。

示例代码:

from concurrent.futures import ThreadPoolExecutor
import time

# 定义目标函数
def worker_function(name, sleep_time):
    print(f"Thread {name} starting")
    time.sleep(sleep_time)
    print(f"Thread {name} finishing")
    return f"{name} completed"

if __name__ == '__main__':
    # 创建线程池
    with ThreadPoolExecutor(max_workers=2) as executor:
        # 提交任务到线程池
        future1 = executor.submit(worker_function, "Thread 1", 2)
        future2 = executor.submit(worker_function, "Thread 2", 3)

        # 获取结果
        result1 = future1.result()
        result2 = future2.result()

        print(result1)
        print(result2)

在这个示例中,我们使用 ThreadPoolExecutor 创建一个线程池,并设定最大工作线程数。通过 executor.submit() 方法提交任务到线程池中。然后通过调用 future.result() 来获取任务的结果。

需要注意的是,由于 Python 的全局解释器锁(GIL),多线程在 CPU 密集型任务中的性能受限。因此,多线程更适合 I/O 密集型任务。如果你的任务是 CPU 密集型任务,可以考虑使用 multiprocessing 模块来利用多核 CPU。

2.2 结合进度条显示

def square(x):
    return x * x

arg_list = [1, 2, 3, 4]
with ThreadPoolExecutor(max_workers=20) as executor:
	ret_list = list(tqdm(executor.map(square, arg_list), total=len(arg_list)))
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中实现多线程多进程的方式有很多,例如使用Thread和Process模块,以及使用concurrent.futures和multiprocessing模块等。下面介绍一些多线程多进程调优的方法: 1. 使用线程池和进程池 创建大量线程或进程会导致系统资源的浪费和性能下降,因此可以使用线程池和进程池来控制并发数量,提高执行效率。线程池和进程池可以通过ThreadPoolExecutor和ProcessPoolExecutor来创建,示例如下: ```python from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor # 创建线程池 with ThreadPoolExecutor(max_workers=4) as executor: results = executor.map(func, args) # 创建进程池 with ProcessPoolExecutor(max_workers=4) as executor: results = executor.map(func, args) ``` 其中,max_workers表示最大并发数,func表示要执行的函数,args表示函数的参数。 2. 使用共享内存 多进程之间的通信可以使用共享内存来提高效率,例如使用multiprocessing模块中的Value和Array来创建共享变量,示例如下: ```python import multiprocessing as mp # 创建共享变量 value = mp.Value('i', 0) array = mp.Array('i', range(10)) ``` 其中,'i'表示变量类型为整型,0表示初始值,range(10)表示数组的初始值。 3. 避免全局解释器锁(GIL) Python的全局解释器锁(GIL)会导致多线程程序的性能瓶颈,因此可以使用多进程来避免GIL的影响。另外,也可以使用Cython等工具将CPU密集型任务转换为C语言或其他语言来提高性能。 4. 使用异步编程 异步编程可以将阻塞的I/O操作转化为非阻塞的异步操作,从而提高程序的性能和响应速度。Python中可以使用asyncio模块来实现异步编程,示例如下: ```python import asyncio async def func(): # 异步操作 pass # 创建事件循环 loop = asyncio.get_event_loop() # 异步执行函数 loop.run_until_complete(func()) ``` 其中,async定义的函数表示异步函数,asyncio.get_event_loop()用于创建事件循环,loop.run_until_complete()用于异步执行函数。 以上是一些多线程多进程调优的方法,可以根据实际情况选择相应的方法来提高程序性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值