python:进程的创建与进程间通信

1、什么是进程?

  进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

2、一个简单的进程示例

from multiprocessing import Process
import time

def process1():
    for i in range(5):
        print(f"进程1的第{i}次循环")
        time.sleep(0.1)

def process2():
    for i in range(5):
        print(f"进程2的第{i}次循环")
        time.sleep(0.1)

if __name__ == '__main__':
    p1 = Process(target=process1, name="紫禁城1")  # 创建进程
    p2 = Process(target=process2, name="紫禁城2")
    p1.start()  # 启动进程
    p2.start()

  开启多个进程,同时执行多个任务,Process()函数的参数:target指定进程执行的函数,name指定进程的名字,args=(参数, )指定给进程函数的参数,args必须是元组,进程函数的参数放在元组里面

3、进程池的使用

from multiprocessing import Process, Pool
import time


def process1(num):
    for i in range(20):
        print(f"进程{num}的第{i}次循环")
        time.sleep(0.5)
    return num

def alert(num):
    print(f"进程{num}完毕~~~~~~~~~~")


if __name__ == '__main__':
    num_list = [i for i in range(5)]
    pool = Pool(5)  # 指定进程池进程数量,默认为4
    for num in num_list:
        # 创建同步进程任务,进城一个接一个的执行
        # pool.apply(process1, (num, ))
        # 创建异步进程任务, 参数1:进程调用的函数,参数2:给进程函数的参数,参数3:进程结束时的回调函数,接收进程函数的返回值作为参数
        pool.apply_async(process1, (num, ), callback=alert)
    pool.close()  # 关闭进程池,关闭后无法给进程池添加进程了
    pool.join()  # 阻塞,知道所有进程执行完毕后程序才执行完毕

  进程池用于同一个函数多次调用时使用,close()方法用于关闭进程池,关闭后无法再添加进程到进程池,join()方法用于阻塞主进程,直到所有子进程执行完毕之后主进程才能执行完毕

4、进程间通信

from multiporcessing import Queue

def getData(q):
    for i in range(5):
        q.put(i)
        print('put')
    print('爬取完毕')
def process_data(q):
    for i in range(5):
        r = q.get()
        print('get')
    print('处理完毕')
if __name__ == '__main__':
    q = multiprocessing.Queue(2)
    p1 = multiprocessing.Process(target=getData, args=(q,))
    p2 = multiprocessing.Process(target=process_data, args=(q,))
    p1.start()
    p2.start()

  进程间通信是通过队列来实现的,使用的是Queue()方法创建队列,可设置参数指定队列的大小,put()方法将数据入队,get()方法从队列中取出数据

猜你喜欢

转载自www.cnblogs.com/xmcwm/p/11976522.html