通信与共享内存

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?
http://www.imooc.com/wenda/detail/505010

使用共享内存的话在多线程的场景下为了处理竞态,需要加锁,使用起来比较麻烦。另外使用过多的锁,容易使得程序的代码逻辑坚涩难懂,并且容易使程序死锁,死锁了以后排查问题相当困难,特别是很多锁同时存在的时候。

共享内存会涉及到多个线程同时访问修改数据的情况,那得保证数据的安全性,可见性,那就会加锁,加锁会让并行变为串行,cpu也忙于线程抢锁。不如换一种方式,把数据复制一份,每个线程有自己的,只要一个线程干完一件事其他线程不用去抢锁了,这就是一种通信方式,把共享的以通知方式交给线程,实现并发。

其实如果从分布式的角度来理解,就会比较明了了。
打比方,ab两个进程共同对同一个消息队列进行操作,那么,如果使用共享内存的话,是不是这两个进程就必须局限在同一个物理机上,那么通信的意义就大大缩小了。
如果在设计的时候,对于消息队列,只提供读写接口,而对于内部的实现你完全不用去在意,看起来消息队列就像是共享内存一样了。然而你的消息队列可以利用socket进行通信。
所以,上述这句话,不要用共享内存实现通信是指不要让程序一开始就局限在单机上,而是利用通信,也就是封装内部实现,提供接口的方式来进行相应的操作。

并行方法总结:
https://zhuanlan.zhihu.com/p/46678895
1、按并行分类

(1)阻塞(非并行):

非并行方式下,子进程串行执行(完成一个,然后开始下一个),实际不是并行。包括:

multiprocessing.Pool(),apply方法
pathos.multiprocessing.ProcessPool(),pipe方法
pathos.pp.ParallelPool(),pipe方法
pathos.pp.ParallelPool(),map方法
pathos.pp.ParallelPool(),imap方法

(2)批次并行:

批次并行指一批子进程并行执行,且直到该批次所有子进程完成后,才开始下一批次。包括:

multiprocessing.Process() #只能一批一批地添加进程,同一批次内并行

(3)异步:

异步执行指的是一批子进程并行执行,且子进程完成一个,就新开始一个,而不必等待同一批其他进程完成。包括:

multiprocessing.Pool(),apply_async方法
multiprocessing.Pool(),map方法
multiprocessing.Pool(),map_async方法
multiprocessing.Pool(),imap方法
multiprocessing.Pool(),imap_unordered方法
multiprocessing.Pool(),starmap方法
multiprocessing.Pool(),starmap_async方法
concurrent.futures.ProcessPoolExecutor(),submit方法
concurrent.futures.ProcessPoolExecutor(),map方法
pathos.multiprocessing.ProcessPool(),map方法
pathos.multiprocessing.ProcessPool(),imap方法
pathos.multiprocessing.ProcessPool(),uimap方法
pathos.multiprocessing.ProcessPool(),amap方法
pathos.multiprocessing.ProcessPool(),apipe方法
pp.Server(),submit方法
pathos.pp.ParallelPool(),apipe方法
pathos.pp.ParallelPool(),amap方法
pathos.pp.ParallelPool(),uimap方法

猜你喜欢

转载自blog.csdn.net/yaochuyi/article/details/88546133