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

Python函数:如何使用多进程模块创建并发函数?

发布时间:2023-06-09 05:39:54

Python 是一种功能强大,易学易用的编程语言,可用于各种编程任务。Python 提供了多个模块来实现并发编程,如 threadingmultiprocessing 等。在本文中,我们将讨论如何使用 multiprocessing 模块来创建并发函数。

multiprocessing 模块是 Python 的内置模块,用于实现多进程编程。它提供了多个类和函数来帮助我们创建并行应用程序。下面我们将讨论这些类和函数的用法。

1. 创建进程

要创建进程,我们需要先创建 Process 类的实例。Process 类有以下参数:

- target:指定要运行的函数。

- args:指定要传递给目标函数的参数,以元组的形式。

- kwargs:指定要传递给目标函数的关键字参数,以字典的形式。

下面是一个简单的例子:

import multiprocessing

def worker(num):
    """ worker function """
    print('Worker %d started' % num)
    # do some work... 
    print('Worker %d finished' % num)

if __name__ == '__main__':
    # create processes
    p1 = multiprocessing.Process(target=worker, args=(1,))
    p2 = multiprocessing.Process(target=worker, args=(2,))
    
    # start processes
    p1.start()
    p2.start()
    
    # wait for processes to finish
    p1.join()
    p2.join()

在这个例子中,我们创建了两个进程 p1p2,分别运行 worker 函数,并传递不同的参数。然后,我们调用 start( ) 方法来开始进程,并调用 join( ) 方法来等待进程结束。

2. 进程池

如果需要同时创建多个进程并运行相同的函数,我们可以使用 Pool 类。Pool 类有以下参数:

- processes:指定要创建的进程数量。

- initializer:指定初始化函数。

- initargs:指定初始化函数的参数,以元组的形式。

- maxtasksperchild:指定每个进程最大任务数量。

下面是一个例子:

import multiprocessing

def worker(num):
    """ worker function """
    print('Worker %d started' % num)
    # do some work... 
    print('Worker %d finished' % num)

if __name__ == '__main__':
    # create a pool of processes
    with multiprocessing.Pool(processes=2) as pool:
        # start the processes
        pool.map(worker, [1, 2])

在这个例子中,我们使用 with 语句创建一个进程池,并指定要创建的进程数量为 2。然后,我们使用 map( ) 方法来并行地运行 worker 函数,并传递不同的参数。

3. 进程通信

在并发编程中,进程之间需要进行通信来共享数据和状态。multiprocessing 模块提供了多种方式来实现进程通信,如管道、共享内存、队列和信号量等。

下面是一个使用队列来实现进程通信的例子:

import multiprocessing

def producer(queue):
    """ producer function """
    for i in range(5):
        print('Producer put: %s' % i)
        queue.put(i)

def consumer(queue):
    """ consumer function """
    while True:
        data = queue.get()
        if data is None:
            break
        print('Consumer got: %s' % data)

if __name__ == '__main__':
    # create a queue object
    queue = multiprocessing.Queue()
    # create processes
    p1 = multiprocessing.Process(target=producer, args=(queue,))
    p2 = multiprocessing.Process(target=consumer, args=(queue,))
    # start processes
    p1.start()
    p2.start()
    # wait for processes to finish
    p1.join()
    # put a None item in the queue to signal the consumer to stop
    queue.put(None)
    p2.join()

在这个例子中,我们创建了一个队列对象,并传递给生产者和消费者函数。生产者向队列中放入数据,消费者从队列中获取数据并输出。

4. 共享内存

共享内存是一种用于在多个进程之间共享数据的方式,它可以提高并发程序的性能并减少进程间通信的开销。

multiprocessing 模块提供了多个类和函数来实现共享内存。下面是一个使用共享内存来共享数据的例子:

import multiprocessing

def increment(number, array):
    """ increment function """
    for i in range(5):
        array[number] += 1
        print('%d => %s' % (number, array))

if __name__ == '__main__':
    # create a shared array object
    array = multiprocessing.Array('i', [0, 0, 0, 0])
    # create processes
    p1 = multiprocessing.Process(target=increment, args=(0, array))
    p2 = multiprocessing.Process(target=increment, args=(1, array))
    # start processes
    p1.start()
    p2.start()
    # wait for processes to finish
    p1.join()
    p2.join()

在这个例子中,我们使用 Array 类创建了一个共享整型数组,并传递给 increment 函数。increment 函数对共享数组进行增量操作,并输出数组的值。

5. 锁

在并发编程中,访问共享资源时需要使用锁来避免竞态条件。multiprocessing 模块提供了 Lock 类来实现锁。下面是一个使用锁来保护共享资源的例子:

import multiprocessing

def increment(number, array, lock):
    """ increment function """
    for i in range(5):
        lock.acquire()
        array[number] += 1
        print('%d => %s' % (number, array))
        lock.release()

if __name__ == '__main__':
    # create a shared array object
    array = multiprocessing.Array('i', [0, 0, 0, 0])
    # create a lock object
    lock = multiprocessing.Lock()
    # create processes
    p1 = multiprocessing.Process(target=increment, args=(0, array, lock))
    p2 = multiprocessing.Process(target=increment, args=(1, array, lock))
    # start processes
    p1.start()
    p2.start()
    # wait for processes to finish
    p1.join()
    p2.join()

在这个例子中,我们使用 Lock 类创建了一个锁对象,并在对共享数组进行增量操作时获取锁并释放锁。

总结

本文讲解了如何使用 multiprocessing 模块来创建并发函数,包括创建进程、进程池、进程通信、共享内存和锁等内容。并发编程可以有效地提高程序的性能和响应能力,同时也需要注意进程间通信和共享资源的问题。