用ZeroMQ进行多线程编程

用ZeroMQ进行多线程编程

本文翻译自ZeroMQ文档的一小部分内容, 该段落提供了解决多线程问题的一个绝佳方式, 点此查看原文.

ZeroMQ(又称为ØMQ,0MQ,或zmq)看起来像一个可嵌入的网络编程库, 但用起来是个并发框架. 它为你提供的套接字(sockets), 能以进程间, 进程内, TCP 和多播等多种方式传输原子消息. 你可以用扇出, 发布-订阅, 任务分发, 和请求-应答等多种模式, 给套接字建立多对多的连接. 它速度之快足以构建集群产品. 它的异步IO模型可供你编写作为异步消息处理任务的可扩展的多核应用. 它有几十个API, 能运行在大多数的操作系统上. ZeroMQ源自IMatix并按LGPLv3许可开放源码.
要了解关于ZeroMQ的更多信息, 请访问ZeroMQ官方网站以及阅读完整手册API文档.


ZeroMQ有可能是编写多线程应用的最佳方式. 然而, 如果你习惯于使用传统套接字, 那么ZeroMQ套接字你需要重新适应一下, ZeroMQ多线程编程将会把你知道的关于多线程应用的一切, 统统堆到院子里, 浇上汽油, 再点一把火. 该烧的书是很少的, 但大部分关于并发编程的书都是.

要编写绝对完美的多线程程序(我就是这个意思), 除了在ZeroMQ套接字之间发送的消息之外, 我们不会使用互斥量(mutex), 锁(lock), 或者任何其他的线程间交互方式.

所谓"完美的多线程程序", 我是指这种代码: 既容易编写又容易理解; 在任何编程语言和操作系统上都使用相同的设计方法; 能以零等待状态,无损耗地扩展到任意数量的CPU.

如果你已经花费多年时间学习技巧, 只为让你的多线程代码能跑, 先不管快不快, 配合锁, 信号量(semaphore)和临界区(critical section), 一旦你发现这些全都无济于事, 你就会想唾弃它们. 在30多年的并发编程中, 如果我们只学到了一课, 那就是不要共享状态. 那就像是让两个酒鬼喝同一瓶啤酒. 他们是不是哥们无关紧要. 争抢是迟早的事. 而在桌上的酒鬼越多, 他们对酒就争抢得越厉害. 不幸的大多数多线程应用, 就像是酒吧的醉汉抢酒喝.

当你编写传统的共享状态的多线程代码的时候, 你要处理的诡异问题的列表, 要是没有直接转化成打击和风险的话, 将会很滑稽, 因为之前看起来正常的代码在压力之下突然失效了. 一个在问题代码方面有着震惊世界的经验的大公司,
发布了其名为"你的多线程代码可能有的11个问题"的列表, 其中包括忘记进行同步, 不正确的粒度, 读写割裂, 无锁重新排序, 锁护航(lock convoys), 两步舞和优先级反转.

对, 我们只举了7个问题, 而不是11个. 但这不是重点. 重点是, 你真的希望运行在电网或者股票市场上的代码在某个忙碌的周四下午3点发生锁护航吗? 谁在乎这个术语到底是什么意思呢! 我们编程不是为了干这些, 以越发复杂的黑客手段来对抗越来越复杂的副作用.

一些广泛使用的模型, 尽管是整个工业的基础, 却根本就不靠谱, 共享状态并发就是其中之一. 需要无限扩展的代码要采用互联网的做法, 发送消息, 同时除了对坏的编程模型的普遍鄙视之外, 什么也不共享.

要使用ZeroMQ写出满意的多线程代码, 你应遵循以下规则:

  • 在线程中隐秘地隔离数据, 永远不要在多个线程中共享数据. 唯一的例外是ZeroMQ的contexts, 它们是线程安全的.
  • 别用互斥量, 临界区, 信号量等传统的并发机制. 在ZeroMQ应用中这些都是反模式.
  • 进程开始时创建一个ZeroMQ context, 并把它传递给你将用inproc套接字关联的所有线程.
  • 使用 attached 线程在应用中构建结构, 并用 inproc PAIR 套接字连到父线程上. 这个模式是绑定父套接字, 然后创建会连接它的套接字子线程.
  • 使用 detached 线程模拟独立任务, 带有自己的contexts. 用tcp连接它们. 以后你可以把这些转移到单独的进程而不需要修改很多代码.
  • 线程间所有的交互都通过你自己多多少少正式定义的ZeroMQ消息实现.
  • 不要在线程间共享ZeroMQ套接字. ZeroMQ套接字不是线程安全的. 技术上要把一个套接字从一个线程迁移到另一个线程也是可行的, 但需要技巧.
    线程间共享套接字的稍微合理的唯一场景, 是在需要套接字垃圾回收之类的神奇功能的语言绑定中.

例如, 如果你需要在应用中开启一个以上的代理服务, 那么你要让每个代理运行在自己的线程中. 很容易犯的一个错误是在一个线程中创建代理的前端和后端的套接字, 然后把套接字传递给另一个线程中的代理. 这样的话, 一开始或许能工作, 但在实际使用中会出现随机的失败. 记住:不要使用或者关闭套接字,除非是在创建它们的线程里.

如果你遵循这些规则, 那么你能很容易的构建优雅的多线程应用, 并在以后需要的时候把线程拆分到单独的进程中去. 应用的逻辑可以放在线程, 进程, 或者节点中, 随便你怎么扩展.

ZeroMQ使用本地操作系统的线程, 而不是虚拟的"绿色"线程. 其优点是你不需要学习新的线程API, 并且ZeroMQ线程干净地映射到你的操作系统. 你能使用Intel的线程检查器(ThreadChecker)之类的标准工具来查看你的应用在干什么. 其缺点是本地线程API并不总是可移植的, 并且如果你线程数量很多(成千上万的), 就会对有些操作系统会造成压力.

示例和进一步信息, 请查看原文.

2017-05-25

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,088评论 0 23
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,448评论 25 707
  • 下午从工作室回来得有点早,看到院子楼下有一个身穿西服的人,正坐在一条长凳子上磨一把菜刀,头上的草帽盖住了整个脸。想...
    助心阅读 502评论 6 7
  • 按照惯例,先上几张风景棒棒的图片,这是我在地中海拍的照片,以前上学的时候只在课本上听过地中海这个海,因为她的面(m...
    不看茶的小二阅读 723评论 7 4
  • 亲子阅读的好处,我相信已经不用我多说了,每个爸爸妈妈都能说出很多条来。可是在实践中,很多新手爸妈都会有这样的疑惑:...
    王小花和mo阅读 336评论 0 0