Python同一个程序运行两个进程

在Python编程中,我们经常需要同时执行多个任务。有时候,这些任务之间可能需要进行交互或者共享数据。为了实现这样的功能,我们可以使用多进程来同时执行不同的任务。

什么是进程?

进程是计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件句柄等资源。进程之间是相互独立的,它们不能直接访问彼此的资源。不过,进程可以通过进程间通信(IPC)来进行交互和数据共享。

Python中的多进程

Python为我们提供了multiprocessing模块,用于实现多进程编程。该模块提供了创建进程的类和函数,以及进程间通信的机制。

首先,我们需要导入multiprocessing模块:

import multiprocessing

接下来,我们可以使用Process类来创建一个进程。下面是一个简单的例子,演示了如何创建一个进程并执行任务:

def task():
    print("Running task...")

if __name__ == "__main__":
    p = multiprocessing.Process(target=task)
    p.start()

在上面的例子中,我们定义了一个task函数,它将在新创建的进程中执行。然后,我们通过Process类创建一个进程,并将task函数作为参数传递给它。最后,我们调用start方法来启动新的进程。

进程间通信

在实际应用中,我们可能需要在不同的进程之间进行数据共享或者交互。为了实现这样的功能,multiprocessing模块提供了多种进程间通信的机制,如队列、管道和共享内存等。

队列(Queue)

队列是一种常见的数据结构,用于在多个进程之间传递数据。multiprocessing模块提供了Queue类,用于实现进程间的数据共享。

下面是一个示例,演示了如何使用队列在两个进程之间传递数据:

def producer(queue):
    for i in range(10):
        queue.put(i)
        print(f"Producer: {i}")
        time.sleep(1)

def consumer(queue):
    while True:
        if not queue.empty():
            item = queue.get()
            print(f"Consumer: {item}")
        time.sleep(0.5)

if __name__ == "__main__":
    queue = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=producer, args=(queue,))
    p2 = multiprocessing.Process(target=consumer, args=(queue,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

在上面的例子中,我们创建了一个Queue对象,用于在producer进程和consumer进程之间传递数据。producer进程将一系列数字放入队列中,而consumer进程则从队列中取出数字并打印出来。

管道(Pipe)

管道是一种用于在两个进程之间传递数据的机制。multiprocessing模块提供了Pipe类,用于创建一个管道。

下面是一个示例,演示了如何使用管道在两个进程之间传递数据:

def sender(conn):
    for i in range(10):
        conn.send(i)
        print(f"Sender: {i}")
        time.sleep(1)
    conn.close()

def receiver(conn):
    while True:
        try:
            item = conn.recv()
            print(f"Receiver: {item}")
        except EOFError:
            break

if __name__ == "__main__":
    parent_conn, child_conn = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=sender, args=(parent_conn,))
    p2 = multiprocessing.Process(target=receiver, args=(child_conn,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

在上面的例子中,我们创建了一个管道,用于在sender进程和receiver进程之间传递数据。sender进程将一系列数字发送到管道中,而receiver进程则从管道中接收数字并打印出来。

共享内存(Shared Memory)

共享