这篇教程Python多进程之进程同步及通信详解写得很实用,希望能帮到您。 上篇文章介绍了什么是进程、进程与程序的关系、进程的创建与使用、创建进程池等,接下来就来介绍一下进程同步及进程通信。
进程同步当多个进程使用同一份数据资源的时候,因为进程的运行没有顺序,运行起来也无法控制,如果不加以干预,往往会引发数据安全或顺序混乱的问题,所以要在多个进程读写共享数据资源的时候加以适当的策略,来保证数据的一致性问题。
Lock(锁)一个Lock对象有两个方法:acquire()和release()来控制共享数据的读写权限, 看下面这张图片,使用多进程的时候会经常出现这种情况,这是因为多个进程都在抢占输出资源,共享同一打印终端,从而造成了输出信息的错乱。 
那么就可以使用Lock机制: import multiprocessingimport randomimport timedef work(lock, i): lock.acquire() print("work'{}'执行中......".format(i), multiprocessing.current_process().name, multiprocessing.current_process().pid) time.sleep(random.randint(0, 2)) print("work'{}'执行完毕......".format(i)) lock.release()if __name__ == '__main__': lock = multiprocessing.Lock() for i in range(5): p = multiprocessing.Process(target=work, args=(lock, i)) p.start() 由于引入了Lock机制,同一时间只能有一个进程抢占到输出资源,其他进程等待该进程结束,锁释放到,才可以抢占,这样会解决多进程间资源竞争导致数据错乱的问题,但是由并发执行变成了串行执行,会牺牲运行效率。
进程通信上篇文章说过,进程之间互相隔离,数据是独立的,默认情况下互不影响,那要如何实现进程间通信呢?Python提供了多种进程通信的方式,下面就来说一下。
Queue(队列)multiprocessing 模块提供的Queue多进程安全的消息队列,可以实现多进程之间的数据传递。
说明 |