{"id":1116,"date":"2018-04-17T20:14:04","date_gmt":"2018-04-17T12:14:04","guid":{"rendered":"https:\/\/damogame.cn:15443\/wordpress\/?p=1116"},"modified":"2019-06-25T20:10:42","modified_gmt":"2019-06-25T12:10:42","slug":"%e5%8d%8f%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/1116","title":{"rendered":"\u534f\u7a0b"},"content":{"rendered":"<h2>\u4ec0\u4e48\u662f\u534f\u7a0b<\/h2>\n<p>wikipedia \u7684\u5b9a\u4e49\uff1a \u534f\u7a0b\u662f\u4e00\u4e2a\u65e0\u4f18\u5148\u7ea7\u7684\u5b50\u7a0b\u5e8f\u8c03\u5ea6\u7ec4\u4ef6\uff0c\u5141\u8bb8\u5b50\u7a0b\u5e8f\u5728\u7279\u70b9\u7684\u5730\u65b9\u6302\u8d77\u6062\u590d\u3002<\/p>\n<p>\u7ebf\u7a0b\u5305\u542b\u4e8e\u8fdb\u7a0b\uff0c\u534f\u7a0b\u5305\u542b\u4e8e\u7ebf\u7a0b\u3002\u53ea\u8981\u5185\u5b58\u8db3\u591f\uff0c\u4e00\u4e2a\u7ebf\u7a0b\u4e2d\u53ef\u4ee5\u6709\u4efb\u610f\u591a\u4e2a\u534f\u7a0b\uff0c\u4f46\u67d0\u4e00\u65f6\u523b\u53ea\u80fd\u6709\u4e00\u4e2a\u534f\u7a0b\u5728\u8fd0\u884c\uff0c\u591a\u4e2a\u534f\u7a0b\u5206\u4eab\u8be5\u7ebf\u7a0b\u5206\u914d\u5230\u7684\u8ba1\u7b97\u673a\u8d44\u6e90\u3002<\/p>\n<h2>\u4e3a\u4ec0\u4e48\u9700\u8981\u534f\u7a0b<\/h2>\n<h3>\u7b80\u5355\u5f15\u5165<\/h3>\n<p>\u5c31\u5b9e\u9645\u4f7f\u7528\u7406\u89e3\u6765\u8bb2\uff0c\u534f\u7a0b\u5141\u8bb8\u6211\u4eec\u5199\u540c\u6b65\u4ee3\u7801\u7684\u903b\u8f91\uff0c\u5374\u505a\u7740\u5f02\u6b65\u7684\u4e8b\uff0c\u907f\u514d\u4e86\u56de\u8c03\u5d4c\u5957\uff0c\u4f7f\u5f97\u4ee3\u7801\u903b\u8f91\u6e05\u6670\u3002code like this:<\/p>\n<pre class=\"prettyprint language-js\"><code><span class=\"pln\">   co<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">function<\/span><span class=\"pun\">*(<\/span><span class=\"pln\">next<\/span><span class=\"pun\">){<\/span><span class=\"pln\">\r\n     let <\/span><span class=\"pun\">[<\/span><span class=\"pln\">err<\/span><span class=\"pun\">,<\/span><span class=\"pln\">data<\/span><span class=\"pun\">]=<\/span><span class=\"pln\">yield fs<\/span><span class=\"pun\">.<\/span><span class=\"pln\">readFile<\/span><span class=\"pun\">(<\/span><span class=\"str\">\".\/test.txt\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">next<\/span><span class=\"pun\">);<\/span><span class=\"com\">\/\/\u5f02\u6b65\u8bfb\u6587\u4ef6<\/span>\r\n     <span class=\"pun\">[<\/span><span class=\"pln\">err<\/span><span class=\"pun\">]=<\/span><span class=\"pln\">yield fs<\/span><span class=\"pun\">.<\/span><span class=\"pln\">appendFile<\/span><span class=\"pun\">(<\/span><span class=\"str\">\".\/test2.txt\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">data<\/span><span class=\"pun\">,<\/span><span class=\"pln\">next<\/span><span class=\"pun\">);<\/span><span class=\"com\">\/\/\u5f02\u6b65\u5199\u6587\u4ef6<\/span>\r\n     <span class=\"com\">\/\/....<\/span>\r\n   <span class=\"pun\">})()<\/span><\/code><\/pre>\n<p><strong>\u5f02\u6b65<\/strong> \u6307\u4ee4\u6267\u884c\u4e4b\u540e\uff0c\u7ed3\u679c\u5e76\u4e0d\u7acb\u5373\u663e\u73b0\u7684\u64cd\u4f5c\u79f0\u4e3a\u5f02\u6b65\u64cd\u4f5c\u3002\u53ca\u5176\u6307\u4ee4\u6267\u884c\u5b8c\u6210\u5e76\u4e0d\u4ee3\u8868\u64cd\u4f5c\u5b8c\u6210\u3002<\/p>\n<p>\u534f\u7a0b\u662f\u8ffd\u6c42\u6781\u9650\u6027\u80fd\u548c\u4f18\u7f8e\u7684\u4ee3\u7801\u7ed3\u6784\u7684\u4ea7\u7269\u3002<\/p>\n<h3>\u4e00\u70b9\u5386\u53f2<\/h3>\n<p>\u8d77\u521d\u4eba\u4eec\u559c\u6b22\u540c\u6b65\u7f16\u7a0b\uff0c\u7136\u540e\u53d1\u73b0\u6709\u4e00\u5806\u7ebf\u7a0b\u56e0\u4e3aI\/O\u5361\u5728\u90a3\u91cc,\u5e76\u53d1\u4e0a\u4e0d\u53bb\uff0c\u8d44\u6e90\u4e25\u91cd\u6d6a\u8d39\u3002<\/p>\n<p>\u7136\u540e\u51fa\u4e86\u5f02\u6b65\uff08select,epoll,kqueue,etc\uff09,\u5c06I\/O\u64cd\u4f5c\u4ea4\u7ed9\u5185\u6838\u7ebf\u7a0b,\u81ea\u5df1\u6ce8\u518c\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\u5904\u7406\u6700\u7ec8\u7ed3\u679c\u3002<\/p>\n<p>\u7136\u800c\u9879\u76ee\u5927\u4e86\u4e4b\u540e\u4ee3\u7801\u7ed3\u6784\u53d8\u5f97\u4e0d\u6e05\u6670,\u4e0b\u9762\u662f\u4e2a\u5c0f\u4f8b\u5b50\u3002<\/p>\n<pre class=\"prettyprint language-js\"><code><span class=\"pln\">  async_func1<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"hello world\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">func<\/span><span class=\"pun\">(){<\/span><span class=\"pln\">\r\n     async_func2<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"what's up?\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">func<\/span><span class=\"pun\">(){<\/span><span class=\"pln\">\r\n       async_func2<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"oh ,friend!\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">func<\/span><span class=\"pun\">(){<\/span> \r\n         <span class=\"com\">\/\/todo something<\/span>\r\n       <span class=\"pun\">})<\/span>\r\n     <span class=\"pun\">})<\/span>\r\n  <span class=\"pun\">})<\/span><\/code><\/pre>\n<p>\u4e8e\u662f\u53d1\u660e\u4e86\u534f\u7a0b\uff0c\u5199\u540c\u6b65\u7684\u4ee3\u7801\uff0c\u4eab\u53d7\u7740\u5f02\u6b65\u5e26\u6765\u7684\u6027\u80fd\u4f18\u52bf\u3002<\/p>\n<p><strong>\u7a0b\u5e8f\u8fd0\u884c\u662f\u9700\u8981\u7684\u8d44\u6e90<\/strong>\uff1a<\/p>\n<ul>\n<li>cpu<\/li>\n<li>\u5185\u5b58<\/li>\n<li>I\/O (\u6587\u4ef6\u3001\u7f51\u7edc\uff0c\u78c1\u76d8\uff08\u5185\u5b58\u8bbf\u95ee\u4e0d\u5728\u4e00\u4e2a\u5c42\u7ea7\uff0c\u5ffd\u7565\u4e0d\u8ba1\uff09)<\/li>\n<\/ul>\n<h2>\u534f\u7a0b\u7684\u5b9e\u73b0\u539f\u7406\uff08c++\u548cnode.js\u91cc\u9762\u7684\u5b9e\u73b0\uff09<\/h2>\n<h3>libco \u4e00\u4e2aC++\u534f\u7a0b\u5e93\u5b9e\u73b0<\/h3>\n<p>libco \u662f\u817e\u8baf\u5f00\u6e90\u7684\u4e00\u4e2aC++\u534f\u7a0b\u5e93\uff0c\u4f5c\u4e3a\u5fae\u4fe1\u540e\u53f0\u7684\u57fa\u7840\u5e93\uff0c\u7ecf\u53d7\u4f4f\u4e86\u5b9e\u9645\u7684\u68c0\u9a8c\u3002\u9879\u76ee\u5730\u5740\uff1a<a href=\"https:\/\/github.com\/Tencent\/libco\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/Tencent\/libco<\/a><\/p>\n<p>\u4e2a\u4eba\u6e90\u7801\u9605\u8bfb\u9879\u76ee\uff1a<a href=\"https:\/\/github.com\/yyrdl\/libco-code-study\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/yyrdl\/libco-code-study<\/a> \uff08\u672a\u5b8c\u7ed3\uff09<\/p>\n<p>libco\u6e90\u4ee3\u7801\u6587\u4ef6\u4e00\u517111\u4e2a\uff0c\u5176\u4e2d\u4e00\u4e2a\u662f\u6c47\u7f16\u4ee3\u7801\uff0c\u5176\u4f59\u662fC++\uff0c\u9605\u8bfb\u8d77\u6765\u76f8\u5bf9\u8f83\u5bb9\u6613\u3002<\/p>\n<p>\u5728C++\u91cc\u9762\u5b9e\u73b0\u534f\u7a0b\u8981\u89e3\u51b3\u7684\u95ee\u9898\u6709\u5982\u4e0b\u51e0\u4e2a\uff1a<\/p>\n<ul>\n<li>\u4f55\u65f6\u6302\u8d77\u534f\u7a0b\uff1f\u4f55\u65f6\u5524\u9192\u534f\u7a0b\uff1f<\/li>\n<li>\u5982\u4f55\u6302\u8d77\u3001\u5524\u9192\u534f\u7a0b\uff0c\u5982\u4f55\u4fdd\u62a4\u534f\u7a0b\u8fd0\u884c\u65f6\u7684\u4e0a\u4e0b\u6587\uff1f<\/li>\n<li>\u5982\u4f55\u5c01\u88c5\u5f02\u6b65\u64cd\u4f5c\uff1f<\/li>\n<\/ul>\n<h4>\u524d\u671f\u77e5\u8bc6\u51c6\u5907<\/h4>\n<ol>\n<li>\u73b0\u4ee3\u64cd\u4f5c\u7cfb\u7edf\u662f\u5206\u65f6\u64cd\u4f5c\u7cfb\u7edf\uff0c\u8d44\u6e90\u5206\u914d\u7684\u57fa\u672c\u5355\u4f4d\u662f\u8fdb\u7a0b\uff0cCPU\u8c03\u5ea6\u7684\u57fa\u672c\u5355\u4f4d\u662f\u7ebf\u7a0b\u3002<\/li>\n<li>C++\u7a0b\u5e8f\u8fd0\u884c\u65f6\u4f1a\u6709\u4e00\u4e2a\u8fd0\u884c\u65f6\u6808\uff0c\u4e00\u6b21\u51fd\u6570\u8c03\u7528\u5c31\u4f1a\u5728\u6808\u4e0a\u751f\u6210\u4e00\u4e2arecord<\/li>\n<li>\u8fd0\u884c\u65f6\u5185\u5b58\u7a7a\u95f4\u5206\u4e3a\u5168\u5c40\u53d8\u91cf\u533a\uff08\u5b58\u653e\u51fd\u6570\uff0c\u5168\u5c40\u53d8\u91cf\uff09,\u6808\u533a\uff0c\u5806\u533a\u3002\u6808\u533a\u5185\u5b58\u5206\u914d\u4ece\u9ad8\u5730\u5740\u5f80\u4f4e\u5730\u5740\u5206\u914d\uff0c\u5806\u533a\u4ece\u4f4e\u5730\u5740\u5f80\u9ad8\u5730\u5740\u5206\u914d\u3002<\/li>\n<li>\u4e0b\u4e00\u6761\u6307\u4ee4\u5730\u5740\u5b58\u5728\u4e8e\u6307\u4ee4\u5bc4\u5b58\u5668IP\uff0cESP\u5bc4\u5b58\u503c\u6307\u5411\u5f53\u524d\u6808\u9876\u5730\u5740\uff0cEBP\u6307\u5411\u5f53\u524d\u6d3b\u52a8\u6808\u5e27\u7684\u57fa\u5730\u5740\u3002<\/li>\n<li>\u53d1\u751f\u51fd\u6570\u8c03\u7528\u65f6\u64cd\u4f5c\u4e3a\uff1a\u5c06\u53c2\u6570\u4ece\u53f3\u5f80\u5de6\u4f9d\u6b21\u538b\u6808\uff0c\u5c06\u8fd4\u56de\u5730\u5740\u538b\u6808\uff0c\u5c06\u5f53\u524dEBP\u5bc4\u5b58\u5668\u7684\u503c\u538b\u6808\uff0c\u5728\u6808\u533a\u5206\u914d\u5f53\u524d\u51fd\u6570\u5c40\u90e8\u53d8\u91cf\u6240\u9700\u7684\u7a7a\u95f4\uff0c\u8868\u73b0\u4e3a\u4fee\u6539ESP\u5bc4\u5b58\u5668\u7684\u503c\u3002<\/li>\n<li>\u534f\u7a0b\u7684\u4e0a\u4e0b\u6587\u5305\u542b\u5c5e\u4e8e\u4ed6\u7684\u6808\u533a\u548c\u5bc4\u5b58\u5668\u91cc\u9762\u5b58\u653e\u7684\u503c\u3002<\/li>\n<\/ol>\n<h3>\u4f55\u65f6\u6302\u8d77\uff0c\u5524\u9192\u534f\u7a0b\uff1f<\/h3>\n<p>\u5982\u5f00\u59cb\u4ecb\u7ecd\u65f6\u6240\u8bf4\uff0c\u534f\u7a0b\u662f\u4e3a\u4e86\u4f7f\u7528\u5f02\u6b65\u7684\u4f18\u52bf\uff0c\u5f02\u6b65\u64cd\u4f5c\u662f\u4e3a\u4e86\u907f\u514dIO\u64cd\u4f5c\u963b\u585e\u7ebf\u7a0b\u3002\u90a3\u4e48\u534f\u7a0b\u6302\u8d77\u7684\u65f6\u523b\u5e94\u8be5\u662f\u5f53\u524d\u534f\u7a0b\u53d1\u8d77\u5f02\u6b65\u64cd\u4f5c\u7684\u65f6\u5019\uff0c\u800c\u5524\u9192\u5e94\u8be5\u5728\u5176\u4ed6\u534f\u7a0b\u9000\u51fa\uff0c\u5e76\u4e14\u4ed6\u7684\u5f02\u6b65\u64cd\u4f5c\u5b8c\u6210\u65f6\u3002<\/p>\n<h3>\u5982\u4f55\u6302\u8d77\u3001\u5524\u9192\u534f\u7a0b\uff0c\u5982\u4f55\u4fdd\u62a4\u534f\u7a0b\u8fd0\u884c\u65f6\u7684\u4e0a\u4e0b\u6587\uff1f<\/h3>\n<p>\u534f\u7a0b\u53d1\u8d77\u5f02\u6b65\u64cd\u4f5c\u7684\u65f6\u523b\u662f\u8be5\u6302\u8d77\u534f\u7a0b\u7684\u65f6\u523b\uff0c\u4e3a\u4e86\u4fdd\u8bc1\u5524\u9192\u65f6\u80fd\u6b63\u5e38\u8fd0\u884c\uff0c\u9700\u8981\u6b63\u786e\u4fdd\u5b58\u5e76\u6062\u590d\u5176\u8fd0\u884c\u65f6\u7684\u4e0a\u4e0b\u6587\u3002<\/p>\n<p>\u6240\u4ee5\u8fd9\u91cc\u7684\u64cd\u4f5c\u6b65\u9aa4\u4e3a\uff1a<\/p>\n<ul>\n<li>\u4fdd\u5b58\u5f53\u524d\u534f\u7a0b\u7684\u4e0a\u4e0b\u6587\uff08\u8fd0\u884c\u6808\uff0c\u8fd4\u56de\u5730\u5740\uff0c\u5bc4\u5b58\u5668\u72b6\u6001\uff09<\/li>\n<li>\u8bbe\u7f6e\u5c06\u8981\u5524\u9192\u7684\u534f\u7a0b\u7684\u5165\u53e3\u6307\u4ee4\u5730\u5740\u5230IP\u5bc4\u5b58\u5668<\/li>\n<li>\u6062\u590d\u5c06\u8981\u5524\u9192\u7684\u534f\u7a0b\u7684\u4e0a\u4e0b\u6587<\/li>\n<\/ul>\n<p>\u8fd9\u90e8\u5206\u64cd\u4f5c\u76f8\u5e94\u7684\u6e90\u4ee3\u7801\uff1a<\/p>\n<pre class=\"prettyprint language-S\"><code><span class=\"pun\">.<\/span><span class=\"pln\">globl coctx_swap<\/span><span class=\"com\">\/\/\u5b9a\u4e49\u8be5\u90e8\u5206\u6c47\u7f16\u4ee3\u7801\u5bf9\u5916\u66b4\u9732\u7684\u51fd\u6570\u540d<\/span>\r\n<span class=\"com\">#if !defined( __APPLE__ )<\/span>\r\n<span class=\"pun\">.<\/span><span class=\"pln\">type  coctx_swap<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">@function<\/span>\r\n<span class=\"com\">#endif<\/span><span class=\"pln\">\r\ncoctx_swap<\/span><span class=\"pun\">:<\/span>\r\n\r\n<span class=\"com\">#if defined(__i386__)<\/span><span class=\"pln\">\r\n\tleal <\/span><span class=\"lit\">4<\/span><span class=\"pun\">(%<\/span><span class=\"pln\">esp<\/span><span class=\"pun\">),<\/span> <span class=\"pun\">%<\/span><span class=\"pln\">eax <\/span><span class=\"com\">\/\/sp   R[eax]=R[esp]+4 R[eax]\u7684\u503c\u5e94\u8be5\u4e3acoctx_swap\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u5728\u6808\u4e2d\u7684\u5730\u5740<\/span><span class=\"pln\">\r\n\tmovl <\/span><span class=\"lit\">4<\/span><span class=\"pun\">(%<\/span><span class=\"pln\">esp<\/span><span class=\"pun\">),<\/span> <span class=\"pun\">%<\/span><span class=\"pln\">esp  <\/span><span class=\"com\">\/\/    R[esp]=Mem[R[esp]+4] \u5c06esp\u6307\u5411 &amp;(curr-&gt;ctx) \u5f53\u524droutine \u4e0a\u4e0b\u6587\u7684\u5185\u5b58\u5730\u5740\uff0cctx\u5728\u5806\u533a\uff0c\u73b0\u5728esp\u5e94\u6307\u5411reg[0]<\/span><span class=\"pln\">\r\n\tleal <\/span><span class=\"lit\">32<\/span><span class=\"pun\">(%<\/span><span class=\"pln\">esp<\/span><span class=\"pun\">),<\/span> <span class=\"pun\">%<\/span><span class=\"pln\">esp <\/span><span class=\"com\">\/\/parm a : &amp;regs[7] + sizeof(void*)   push \u64cd\u4f5c\u662f\u4ee5esp\u7684\u503c\u4e3a\u57fa\u51c6\uff0cpush\u4e00\u4e2a\u503c,\u5219esp\u7684\u503c\u51cf\u4e00\u4e2a\u5355\u4f4d\uff08\u56e0\u4e3a\u662f\u6309\u6808\u533a\u7684\u64cd\u4f5c\u903b\u8f91\uff0c\u4ece\u9ad8\u4f4d\u5f80\u4f4e\u4f4d\u5206\u914d\u5730\u5740\uff09\uff0c\u4f46ctx\u662f\u5728\u5806\u533a\uff0c\u6240\u4ee5\u5e94\u5c06esp\u6307\u5411reg[7]\uff0c\u7136\u540e\u4eceeax\u5230-4(%eax)push<\/span>\r\n    <span class=\"com\">\/\/\u4fdd\u5b58\u5bc4\u5b58\u5668\u503c\u5230\u6808\u4e2d\uff0c\u5b9e\u9645\u5bf9\u5e94coctx_t-&gt;regs \u6570\u7ec4\u5728\u6808\u4e2d\u7684\u4f4d\u7f6e\uff08\u53c2\u89c1coctx.h \u4e2dcoctx_t\u7684\u5b9a\u4e49\uff09<\/span><span class=\"pln\">\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">eax <\/span><span class=\"com\">\/\/esp -&gt;parm a<\/span><span class=\"pln\">\r\n\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">ebp\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">esi\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">edi\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">edx\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">ecx\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">ebx\r\n\tpushl <\/span><span class=\"pun\">-<\/span><span class=\"lit\">4<\/span><span class=\"pun\">(%<\/span><span class=\"pln\">eax<\/span><span class=\"pun\">)<\/span> <span class=\"com\">\/\/\u5c06\u51fd\u6570\u8fd4\u56de\u5730\u5740\u538b\u6808\uff0c\u5373coctx_swap \u4e4b\u540e\u7684\u6307\u4ee4\u5730\u5740\uff0c\u4fdd\u5b58\u8fd4\u56de\u5730\u5740,\u4fdd\u5b58\u5230coctx_t-&gt;regs[0]<\/span>\r\n\r\n    <span class=\"com\">\/\/\u6062\u590d\u8fd0\u884c\u76ee\u6807routine\u65f6\u7684\u73af\u5883\uff08\u5404\u4e2a\u5bc4\u5b58\u5668\u7684\u503c\u548c\u6808\u72b6\u6001\uff09<\/span><span class=\"pln\">\r\n\tmovl <\/span><span class=\"lit\">4<\/span><span class=\"pun\">(%<\/span><span class=\"pln\">eax<\/span><span class=\"pun\">),<\/span> <span class=\"pun\">%<\/span><span class=\"pln\">esp <\/span><span class=\"com\">\/\/parm b -&gt; &amp;regs[0] \/\/\u5207\u6362esp\u5230\u76ee\u6807 routine  ctx\u5728\u6808\u4e2d\u7684\u8d77\u59cb\u5730\u5740,\u8fd9\u4e2a\u5730\u5740\u6b63\u597d\u5bf9\u5e94regs[0],pop\u4e00\u6b21 esp\u4f1a\u52a0\u4e00\u4e2a\u5355\u4f4d\u7684\u503c<\/span><span class=\"pln\">\r\n\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">eax  <\/span><span class=\"com\">\/\/ret func addr regs[0] \u6682\u5b58\u8fd4\u56de\u5730\u5740\u5230 EAX<\/span>\r\n\t<span class=\"com\">\/\/\u6062\u590d\u5f53\u65f6\u7684\u5bc4\u5b58\u5668\u72b6\u6001<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">ebx  <\/span><span class=\"com\">\/\/ regs[1]<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">ecx  <\/span><span class=\"com\">\/\/ regs[2]<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">edx  <\/span><span class=\"com\">\/\/ regs[3]<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">edi  <\/span><span class=\"com\">\/\/ regs[4]<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">esi  <\/span><span class=\"com\">\/\/ regs[5]<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">ebp  <\/span><span class=\"com\">\/\/ regs[6]<\/span><span class=\"pln\">\r\n\tpopl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">esp  <\/span><span class=\"com\">\/\/ regs[7]<\/span>\r\n\t<span class=\"com\">\/\/\u5c06\u8fd4\u56de\u5730\u5740\u538b\u6808<\/span><span class=\"pln\">\r\n\tpushl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">eax <\/span><span class=\"com\">\/\/set ret func addr<\/span>\r\n    <span class=\"com\">\/\/\u5c06 eax\u6e05\u96f6<\/span><span class=\"pln\">\r\n\txorl <\/span><span class=\"pun\">%<\/span><span class=\"pln\">eax<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">%<\/span><span class=\"pln\">eax\r\n\t<\/span><span class=\"com\">\/\/\u8fd4\u56de\uff0c\u8fd9\u91cc\u8fd4\u56de\u4e4b\u540e\u5c31\u5207\u6362\u5230\u76ee\u6807routine\u4e86\uff0cC++\u4ee3\u7801\u4e2d\u8c03\u7528coctx_swap\u7684\u5730\u65b9\u4e4b\u540e\u7684\u4ee3\u7801\u5c06\u5f97\u4e0d\u5230\u7acb\u5373\u6267\u884c<\/span><span class=\"pln\">\r\n\tret\r\n\r\n<\/span><span class=\"com\">#elif<\/span><\/code><\/pre>\n<p>\u8fd9\u90e8\u5206\u4ee3\u7801\u53ea\u662f\u505a\u4e86\u5bc4\u5b58\u5668\u90e8\u5206\u7684\u64cd\u4f5c\u3002\u4f9d\u8d56\u7684\u7ed3\u6784\u4f53\u5b9a\u4e49\uff0c\u89c1\u6587\u4ef6coctx.h\u4e2d\uff1a<\/p>\n<pre class=\"prettyprint language-c++\"><code><span class=\"kwd\">struct<\/span> <span class=\"typ\">coctx_t<\/span>\r\n<span class=\"pun\">{<\/span>\r\n<span class=\"com\">#if defined(__i386__)<\/span>\r\n\t<span class=\"kwd\">void<\/span> <span class=\"pun\">*<\/span><span class=\"pln\">regs<\/span><span class=\"pun\">[<\/span> <span class=\"lit\">8<\/span> <span class=\"pun\">];<\/span><span class=\"com\">\/\/32\u4f4d\u673a\uff0c\u4f9d\u6b21\u4e3a\uff1aret,ebx,ecx,edx,edi,esi,ebp,eax<\/span>\r\n<span class=\"com\">#else<\/span>\r\n\t<span class=\"kwd\">void<\/span> <span class=\"pun\">*<\/span><span class=\"pln\">regs<\/span><span class=\"pun\">[<\/span> <span class=\"lit\">14<\/span> <span class=\"pun\">];<\/span><span class=\"com\">\/\/64\u4f4d\u673a\u7684\u60c5\u51b5<\/span>\r\n<span class=\"com\">#endif<\/span>\r\n\t<span class=\"typ\">size_t<\/span><span class=\"pln\"> ss_size<\/span><span class=\"pun\">;<\/span><span class=\"com\">\/\/\u7a7a\u95f4\u5927\u5c0f<\/span>\r\n\t<span class=\"kwd\">char<\/span> <span class=\"pun\">*<\/span><span class=\"pln\">ss_sp<\/span><span class=\"pun\">;<\/span><span class=\"com\">\/\/ESP<\/span>\r\n\t\r\n<span class=\"pun\">};<\/span><\/code><\/pre>\n<p>\u8c03\u7528coctx_swap \u51fd\u6570\u53ea\u5728\u6587\u4ef6co_routine.cpp\u4e2d\u7684co_swap\u51fd\u6570\u3002<\/p>\n<p>\u4fdd\u5b58\u8fd0\u884c\u6808\u7684\u64cd\u4f5c\u89c1co_swap\u51fd\u6570\u4e2d\u8c03\u7528coctx_swap\u4e4b\u524d\u7684\u90e8\u5206\u3002\u5177\u4f53\u6b65\u9aa4\u4e3a\u53d6\u5f53\u524d\u6808\u9876\u5730\u5740 \uff08\u4ee3\u7801\uff1a<code>char c; esp=&amp;c<\/code>\uff09,\u82e5\u4e0d\u662f\u5171\u4eab\u6808\u6a21\u578b\u5219\u6e05\u7406\u4e0benv\uff0c\u82e5\u662f\u5219\u5224\u65ad\u5171\u4eab\u6808\u533a\u6709\u6ca1\u6709\u88ab\u5360\u7528\uff0c\u88ab\u5360\u7528\u5219\u4ece\u5806\u533a\u7533\u8bf7\u5185\u5b58\u4fdd\u5b58\uff0c\u7136\u540e\u518d\u5206\u914d\u5171\u4eab\u6808\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0clibco\u8fd0\u884c\u65f6\u7684\u6808\u533a\u4e0d\u5728\u662f\u4f20\u7edf\u610f\u4e49\u4e0a\u7684\u6808\u533a\uff0c\u5176\u7a7a\u95f4\u5b9e\u9645\u6765\u81ea\u4e8e\u5806\u533a\u3002<\/p>\n<h3>\u5982\u4f55\u5c01\u88c5\u5f02\u6b65\u64cd\u4f5c\uff1f<\/h3>\n<p>\u8fd9\u90e8\u5206\u4ee3\u7801\u89c1\uff1a<\/p>\n<ul>\n<li>co_hook_sys_call.cpp<\/li>\n<li>co_routine.cpp<\/li>\n<li>co_epoll.cpp<\/li>\n<li>co_epoll.h<\/li>\n<\/ul>\n<p>\u6838\u5fc3\u601d\u60f3\u662fhook\u7cfb\u7edf\u672c\u6765\u7684I\/O\u63a5\u53e3\uff0c\u6bd4\u5982<code>socket()<\/code>\u51fd\u6570\uff0c\u548cepoll(kqueue)\u7ed3\u5408\uff0c\u91c7\u7528\u4e00\u4e2a<code>co_eventloop<\/code>\u6765\u7edf\u4e00\u7ba1\u7406\uff0c\u5f53\u53d1\u73b0\u4e00\u4e2a\u534f\u7a0b\u53d1\u8d77\u5f02\u6b65\u64cd\u4f5c\u65f6\uff0c\u5c31\u5c06\u5176\u6302\u8d77\u653e\u5165\u7b49\u5f85\u961f\u5217\uff0c\u5524\u9192\u5176\u4ed6\u5f02\u6b65\u64cd\u4f5c\u5df2\u7ecf\u5b8c\u6210\u7684\u534f\u7a0b\u3002\u53ef\u4ee5\u8054\u7cfblibevent\u91cc\u9762\u7684event_loop\uff0c\u533a\u522b\u5728\u5728\u4e8e\u4e00\u4e2a\u662f\u64cd\u4f5c\u6808\u533a\u548c\u5bc4\u5b58\u5668\u6062\u590d\u534f\u7a0b\uff0c\u4e00\u4e2a\u662f\u8c03\u7528\u7ed1\u5b9a\u7684\u56de\u8c03\u51fd\u6570\u3002<\/p>\n<h2>node.js\u91cc\u9762\u534f\u7a0b<\/h2>\n<p>node.js \u7684\u4f18\u52bf\uff1a<\/p>\n<ul>\n<li>node.js\u5929\u751f\u5f02\u6b65\uff08\u4e0b\u9762\u662flibuv\uff09<\/li>\n<li>javascript\u7684\u95ed\u5305\u7279\u6027\u5b8c\u6210\u4e86\u4e0a\u4e0b\u6587\u7684\u4fdd\u5b58\u5de5\u4f5c<\/li>\n<\/ul>\n<p>\u9700\u8981\u6211\u4eec\u505a\u7684\uff1a<\/p>\n<ul>\n<li>\u5b9e\u73b0\u540c\u6b65\u7f16\u7a0b<\/li>\n<\/ul>\n<p>\u9644\u4e0a \u6587\u7ae0\u5f00\u59cb\u65f6\u7684\u4ee3\u7801\uff1a<\/p>\n<pre class=\"prettyprint language-js\"><code>   <span class=\"kwd\">const<\/span><span class=\"pln\"> fs<\/span><span class=\"pun\">=<\/span><span class=\"pln\">require<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"fs\"<\/span><span class=\"pun\">);<\/span>\r\n   <span class=\"kwd\">const<\/span><span class=\"pln\"> co<\/span><span class=\"pun\">=<\/span><span class=\"pln\">require<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"zco\"<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n   \r\n   co<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">function<\/span><span class=\"pun\">*(<\/span><span class=\"pln\">next<\/span><span class=\"pun\">){<\/span><span class=\"pln\">\r\n     let <\/span><span class=\"pun\">[<\/span><span class=\"pln\">err<\/span><span class=\"pun\">,<\/span><span class=\"pln\">data<\/span><span class=\"pun\">]=<\/span><span class=\"pln\">yield fs<\/span><span class=\"pun\">.<\/span><span class=\"pln\">readFile<\/span><span class=\"pun\">(<\/span><span class=\"str\">\".\/test.txt\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">next<\/span><span class=\"pun\">);<\/span><span class=\"com\">\/\/\u5f02\u6b65\u8bfb\u6587\u4ef6<\/span>\r\n     <span class=\"pun\">[<\/span><span class=\"pln\">err<\/span><span class=\"pun\">]=<\/span><span class=\"pln\">yield fs<\/span><span class=\"pun\">.<\/span><span class=\"pln\">appendFile<\/span><span class=\"pun\">(<\/span><span class=\"str\">\".\/test2.txt\"<\/span><span class=\"pun\">,<\/span><span class=\"pln\">data<\/span><span class=\"pun\">,<\/span><span class=\"pln\">next<\/span><span class=\"pun\">);<\/span><span class=\"com\">\/\/\u5f02\u6b65\u5199\u6587\u4ef6<\/span>\r\n     <span class=\"com\">\/\/....<\/span>\r\n   <span class=\"pun\">})()<\/span><\/code><\/pre>\n<h3>JS \u4e2d\u7684Generator<\/h3>\n<p>Generator\u662f\u4e00\u4e2a\u8fed\u4ee3\u5668\u751f\u6210\u5668,\u4e5f\u662fnode.js\u4e2d\u5b9e\u73b0\u534f\u7a0b\u7684\u5173\u952e\u3002<\/p>\n<pre class=\"prettyprint language-js\"><code><span class=\"pln\">\r\nlet gen<\/span><span class=\"pun\">=<\/span><span class=\"kwd\">function<\/span> <span class=\"pun\">*()<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n    console<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"ok1\"<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"kwd\">var<\/span><span class=\"pln\"> a<\/span><span class=\"pun\">=<\/span><span class=\"pln\">yield <\/span><span class=\"lit\">1<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\n    console<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"a:\"<\/span><span class=\"pun\">+<\/span><span class=\"pln\">a<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"kwd\">var<\/span><span class=\"pln\"> b<\/span><span class=\"pun\">=<\/span><span class=\"pln\">yield <\/span><span class=\"lit\">2<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\n    console<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"b:\"<\/span><span class=\"pun\">+<\/span><span class=\"pln\">b<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> iterator<\/span><span class=\"pun\">=<\/span><span class=\"pln\">gen<\/span><span class=\"pun\">();<\/span><span class=\"pln\">\r\nconsole<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"ok2\"<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n\r\nconsole<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"pln\">iterator<\/span><span class=\"pun\">.<\/span><span class=\"pln\">next<\/span><span class=\"pun\">(<\/span><span class=\"lit\">100<\/span><span class=\"pun\">));<\/span><span class=\"pln\">\r\nconsole<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"pln\">iterator<\/span><span class=\"pun\">.<\/span><span class=\"pln\">next<\/span><span class=\"pun\">(<\/span><span class=\"lit\">101<\/span><span class=\"pun\">));<\/span><span class=\"pln\">\r\nconsole<\/span><span class=\"pun\">.<\/span><span class=\"pln\">log<\/span><span class=\"pun\">(<\/span><span class=\"pln\">iterator<\/span><span class=\"pun\">.<\/span><span class=\"pln\">next<\/span><span class=\"pun\">(<\/span><span class=\"lit\">102<\/span><span class=\"pun\">));<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1a<\/p>\n<pre class=\"prettyprint\"><code><span class=\"pln\">ok2\r\nok1\r\n<\/span><span class=\"pun\">{<\/span><span class=\"pln\"> value<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">done<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">false<\/span> <span class=\"pun\">}<\/span><span class=\"pln\">\r\na<\/span><span class=\"pun\">:<\/span><span class=\"lit\">101<\/span>\r\n<span class=\"pun\">{<\/span><span class=\"pln\"> value<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">2<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">done<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">false<\/span> <span class=\"pun\">}<\/span><span class=\"pln\">\r\nb<\/span><span class=\"pun\">:<\/span><span class=\"lit\">102<\/span>\r\n<span class=\"pun\">{<\/span><span class=\"pln\"> value<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">undefined<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">done<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">true<\/span> <span class=\"pun\">}<\/span><\/code><\/pre>\n<p>\u4ece\u8fd9\u91cc\u6211\u4eec\u53ef\u4ee5\u770b\u5230\u5176\u6267\u884c\u987a\u5e8f\uff0c\u4ee5\u53ca\u5404\u4e2a\u503c\u7684\u53d8\u5316\u3002iterator.next() \u8fd4\u56de\u7684\u503c\u5373yield \u4e4b\u540e\u7684\u8868\u8fbe\u5f0f\u7684\u8fd4\u56de\u503c\uff0cyield\u4e4b\u524d\u7684\u53d8\u91cf\u7684\u503c\u5373iterator.next\u65b9\u6cd5\u4f20\u5165\u7684\u503c\u3002\u901a\u8fc7\u8fd9\u4e2a\u7279\u6027\uff0c\u5408\u7406\u5305\u88c5\u5373\u53ef\u5b9e\u73b0coroutine.<\/p>\n<p>\u4ee5\u4e0b\u662f<code>zco<\/code>\u6a21\u5757\u6e90\u7801\uff0c\u9879\u76ee\u5730\u5740\uff1a<a href=\"https:\/\/github.com\/yyrdl\/zco\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/yyrdl\/zco<\/a> \uff1a<\/p>\n<pre class=\"prettyprint language-js\"><code><span class=\"com\">\/**\r\n * Created by yyrdl on 2017\/3\/14.\r\n *\/<\/span>\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> slice <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">Array<\/span><span class=\"pun\">.<\/span><span class=\"pln\">prototype<\/span><span class=\"pun\">.<\/span><span class=\"pln\">slice<\/span><span class=\"pun\">;<\/span>\r\n\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> co <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">gen<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n\r\n\t<span class=\"kwd\">var<\/span><span class=\"pln\"> iterator<\/span><span class=\"pun\">,<\/span><span class=\"pln\">\r\n\tcallback <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span><span class=\"pln\">\r\n\thasReturn <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">false<\/span><span class=\"pun\">;<\/span>\r\n\r\n\t<span class=\"kwd\">var<\/span><span class=\"pln\"> _end <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">e<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> v<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n\t\tcallback <\/span><span class=\"pun\">&amp;&amp;<\/span><span class=\"pln\"> callback<\/span><span class=\"pun\">(<\/span><span class=\"pln\">e<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> v<\/span><span class=\"pun\">);<\/span> <span class=\"com\">\/\/I shoudn't catch the error throwed by user's callback<\/span>\r\n\t\t<span class=\"kwd\">if<\/span><span class=\"pun\">(<\/span><span class=\"pln\">callback<\/span><span class=\"pun\">==<\/span><span class=\"kwd\">null<\/span><span class=\"pun\">&amp;&amp;<\/span><span class=\"pln\">e<\/span><span class=\"pun\">){<\/span><span class=\"com\">\/\/the error should be throwed if no handler instead of  catching silently<\/span>\r\n\t\t\t<span class=\"kwd\">throw<\/span><span class=\"pln\"> e<\/span><span class=\"pun\">;<\/span>\r\n\t\t<span class=\"pun\">}<\/span>\r\n\t<span class=\"pun\">}<\/span>\r\n\t<span class=\"kwd\">var<\/span><span class=\"pln\"> run<\/span><span class=\"pun\">=<\/span><span class=\"kwd\">function<\/span><span class=\"pun\">(<\/span><span class=\"pln\">arg<\/span><span class=\"pun\">){<\/span>\r\n\t\t<span class=\"kwd\">try<\/span> <span class=\"pun\">{<\/span>\r\n\t\t\t<span class=\"kwd\">var<\/span><span class=\"pln\"> v <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> iterator<\/span><span class=\"pun\">.<\/span><span class=\"pln\">next<\/span><span class=\"pun\">(<\/span><span class=\"pln\">arg<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n\t\t\thasReturn <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\n\t\t\tv<\/span><span class=\"pun\">.<\/span><span class=\"pln\">done <\/span><span class=\"pun\">&amp;&amp;<\/span><span class=\"pln\"> _end<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">undefined<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> v<\/span><span class=\"pun\">.<\/span><span class=\"pln\">value<\/span><span class=\"pun\">);<\/span>\r\n\t\t<span class=\"pun\">}<\/span> <span class=\"kwd\">catch<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">e<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n\t\t\t_end<\/span><span class=\"pun\">(<\/span><span class=\"pln\">e<\/span><span class=\"pun\">);<\/span>\r\n\t\t<span class=\"pun\">}<\/span>\r\n\t<span class=\"pun\">}<\/span>\r\n\t<span class=\"kwd\">var<\/span><span class=\"pln\"> nextSlave <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">arg<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n\t\thasReturn <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">false<\/span><span class=\"pun\">;<\/span><span class=\"pln\">\r\n\t\trun<\/span><span class=\"pun\">(<\/span><span class=\"pln\">arg<\/span><span class=\"pun\">);<\/span>\r\n\t<span class=\"pun\">}<\/span>\r\n\t\r\n\t<span class=\"kwd\">var<\/span><span class=\"pln\"> next <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span> <span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n\t\t<span class=\"kwd\">var<\/span><span class=\"pln\"> arg <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> slice<\/span><span class=\"pun\">.<\/span><span class=\"pln\">call<\/span><span class=\"pun\">(<\/span><span class=\"pln\">arguments<\/span><span class=\"pun\">);<\/span>\r\n\t\t<span class=\"kwd\">if<\/span> <span class=\"pun\">(!<\/span><span class=\"pln\">hasReturn<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"com\">\/\/support fake async operation,avoid error: \"Generator is already running\"<\/span><span class=\"pln\">\r\n\t\t\tsetTimeout<\/span><span class=\"pun\">(<\/span><span class=\"pln\">nextSlave<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> arg<\/span><span class=\"pun\">);<\/span>\r\n\t\t<span class=\"pun\">}<\/span> <span class=\"kwd\">else<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n\t\t\tnextSlave<\/span><span class=\"pun\">(<\/span><span class=\"pln\">arg<\/span><span class=\"pun\">);<\/span>\r\n\t\t<span class=\"pun\">}<\/span>\r\n\t<span class=\"pun\">}<\/span>\r\n\t\r\n\t<span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"str\">\"[object GeneratorFunction]\"<\/span> <span class=\"pun\">===<\/span> <span class=\"typ\">Object<\/span><span class=\"pun\">.<\/span><span class=\"pln\">prototype<\/span><span class=\"pun\">.<\/span><span class=\"pln\">toString<\/span><span class=\"pun\">.<\/span><span class=\"pln\">call<\/span><span class=\"pun\">(<\/span><span class=\"pln\">gen<\/span><span class=\"pun\">))<\/span> <span class=\"pun\">{<\/span><span class=\"com\">\/\/todo: support other Generator implements <\/span><span class=\"pln\">\r\n\t\titerator <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> gen<\/span><span class=\"pun\">(<\/span><span class=\"pln\">next<\/span><span class=\"pun\">);<\/span>\r\n\t<span class=\"pun\">}<\/span> <span class=\"kwd\">else<\/span> <span class=\"pun\">{<\/span>\r\n\t\t<span class=\"kwd\">throw<\/span> <span class=\"kwd\">new<\/span> <span class=\"typ\">TypeError<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"the arg of co must be generator function\"<\/span><span class=\"pun\">)<\/span>\r\n\t<span class=\"pun\">}<\/span>\r\n\r\n\t<span class=\"kwd\">var<\/span><span class=\"pln\"> future <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">cb<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n\t\t<span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"str\">\"function\"<\/span> <span class=\"pun\">==<\/span> <span class=\"kwd\">typeof<\/span><span class=\"pln\"> cb<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n\t\t\tcallback <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> cb<\/span><span class=\"pun\">;<\/span>\r\n\t\t<span class=\"pun\">}<\/span><span class=\"pln\">\r\n\t\trun<\/span><span class=\"pun\">();<\/span>\r\n\t<span class=\"pun\">}<\/span>\r\n\r\n\t<span class=\"kwd\">return<\/span><span class=\"pln\"> future<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span><span class=\"pln\">\r\n\r\nmodule<\/span><span class=\"pun\">.<\/span><span class=\"pln\">exports <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> co<\/span><span class=\"pun\">;<\/span><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4ec0\u4e48\u662f\u534f\u7a0b wikipedia \u7684\u5b9a\u4e49\uff1a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[118],"class_list":["post-1116","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/1116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=1116"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/1116\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=1116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=1116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=1116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}