欢迎访问宙启技术站
智能推送

Python中的多进程和多线程函数:使用和示例

发布时间:2023-06-22 19:12:38

Python是一种高级编程语言,它支持多种形式的并发编程。在Python中,多进程和多线程都是常用的并发编程方式。这篇文章将介绍Python中的多进程和多线程函数,包括使用和示例。

1. 多进程函数

在Python中,多进程可以使用multiprocessing模块来实现。multiprocessing模块支持多进程编程,可以轻松地创建和管理多个进程。下面是几个常用的多进程函数:

1.1 Process

Process函数是用来创建新进程的函数。可以使用Process函数来创建多个子进程,并对每个子进程指定不同的任务。下面是一个简单的Process函数示例:

import multiprocessing

def worker():
    """子进程执行的任务"""
    print('Worker')

if __name__ == '__main__':
    # 创建一个新进程
    p = multiprocessing.Process(target=worker)
    # 启动进程
    p.start()
    # 等待进程结束
    p.join()

1.2 Pool

Pool函数可以方便地创建一组进程,可以使用这些进程并行地执行任务。Pool函数允许指定进程池的大小,可以控制并行执行任务的数量。下面是一个简单的Pool函数示例:

import multiprocessing

def worker(x):
    """进程执行的任务"""
    print(f'Started: {x}')
    # 模拟长时间运行的任务
    for i in range(10000000):
        pass
    print(f'Finished: {x}')
    return x * x

if __name__ == '__main__':
    # 创建一个进程池
    with multiprocessing.Pool(processes=4) as pool:
        # 从进程池中异步执行多个任务
        results = [pool.apply_async(worker, args=[x]) for x in range(4)]
        # 等待所有任务完成
        output = [r.get() for r in results]
    print(f'Output: {output}')

1.3 Pipe

Pipe函数用于创建进程之间的双向通信管道。可以使用这些管道在两个进程之间传递数据。下面是一个简单的Pipe函数示例:

import multiprocessing

def sender(conn):
    """发送方进程"""
    conn.send('Hello, receiver!')
    conn.close()

def receiver(conn):
    """接收方进程"""
    message = conn.recv()
    print(f'Received message: {message}')
    conn.close()

if __name__ == '__main__':
    # 创建两个进程间通信的管道
    conn1, conn2 = multiprocessing.Pipe()
    # 创建两个进程,并把管道传递给它们
    p1 = multiprocessing.Process(target=sender, args=(conn1,))
    p2 = multiprocessing.Process(target=receiver, args=(conn2,))
    # 启动进程
    p1.start()
    p2.start()
    # 等待进程结束
    p1.join()
    p2.join()

2. 多线程函数

在Python中,多线程可以使用threading模块来实现。threading模块支持多线程编程,可以轻松地创建和管理多个线程。下面是几个常用的多线程函数:

2.1 Thread

Thread函数是用来创建新线程的函数。可以使用Thread函数来创建多个线程,并对每个线程指定不同的任务。下面是一个简单的Thread函数示例:

import threading

def worker():
    """线程执行的任务"""
    print('Worker')

if __name__ == '__main__':
    # 创建一个新线程
    t = threading.Thread(target=worker)
    # 启动线程
    t.start()
    # 等待线程结束
    t.join()

2.2 Lock

Lock函数用于实现互斥锁。由于Python的全局解释器锁(Global Interpreter Lock, GIL)的存在,多线程在Python中并不能真正意义上实现并行。但是,可以使用Lock函数来实现多线程的互斥。下面是一个简单的Lock函数示例:

import threading

x = 0  # 全局变量
lock = threading.Lock()  # 创建一个锁对象

def worker():
    """线程执行的任务"""
    global x  # 在函数中使用全局变量需要加global关键字
    for i in range(100000):
        with lock:  # 获取锁
            x += 1
    print(f'Done: {x}')

if __name__ == '__main__':
    # 创建多个线程
    threads = [threading.Thread(target=worker) for _ in range(4)]
    # 启动线程
    for t in threads:
        t.start()
    # 等待线程结束
    for t in threads:
        t.join()
    # 打印结果
    print(f'Result: {x}')

2.3 Semaphore

Semaphore函数用于实现信号量。可以使用Semaphore函数实现多线程的同步。下面是一个简单的Semaphore函数示例:

import threading

x = 0  # 全局变量
semaphore = threading.Semaphore(value=3)  # 创建一个信号量对象

def worker():
    """线程执行的任务"""
    with semaphore:  # 请求信号量
        global x  # 在函数中使用全局变量需要加global关键字
        for i in range(100000):
            x += 1
        print(f'Done: {x}')

if __name__ == '__main__':
    # 创建多个线程
    threads = [threading.Thread(target=worker) for _ in range(6)]
    # 启动线程
    for t in threads:
        t.start()
    # 等待线程结束
    for t in threads:
        t.join()
    # 打印结果
    print(f'Result: {x}')

综上,Python中的多进程和多线程函数能够轻松地创建和管理多个进程或线程,可以实现并发编程。需要注意的是,在Python中不同进程或线程之间的数据共享需要使用进程间通信(IPC)或线程间通信(IPC)方式来实现,例如Queue、Pipe等。