{"id":4976,"date":"2021-01-19T19:11:14","date_gmt":"2021-01-19T11:11:14","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=4976"},"modified":"2021-01-19T19:11:14","modified_gmt":"2021-01-19T11:11:14","slug":"python%e4%b8%adasyncio%e6%a8%a1%e5%9d%97","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/4976","title":{"rendered":"python\u4e2dasyncio\u6a21\u5757"},"content":{"rendered":"<p class=\"_1RuRku\"><a href=\"https:\/\/www.jianshu.com\/p\/50384d0d3940\">\u539f\u6587\u5730\u5740<\/a><\/p>\n<div class=\"rEsl9f\">\n<div class=\"_2mYfmT\">\n<div>\n<div class=\"s-dsoj\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<article class=\"_2rhmJa\">\n<h3>asyncio \u662f\u5e72\u4ec0\u4e48\u7684\uff1f<\/h3>\n<ul>\n<li>\u5f02\u6b65\u7f51\u7edc\u64cd\u4f5c<\/li>\n<li>\u5e76\u53d1<\/li>\n<li>\u534f\u7a0b<\/li>\n<\/ul>\n<p>python3.0 \u65f6\u4ee3\uff0c\u6807\u51c6\u5e93\u91cc\u7684\u5f02\u6b65\u7f51\u7edc\u6a21\u5757\uff1a<code>select<\/code>(\u975e\u5e38\u5e95\u5c42) python3.0\u65f6\u4ee3\uff0c\u7b2c\u4e09\u65b9\u5f02\u6b65\u7f51\u7edc\u5e93\uff1a<code>Tornado<\/code><br \/>\npython3.4\u65f6\u4ee3\uff0c<code>asyncio<\/code>\uff1a\u652f\u6301 TCP \uff0c\u5b50\u8fdb\u7a0b<\/p>\n<p>\u73b0\u5728\u7684<code>asyncio<\/code>\uff0c\u6709\u4e86\u5f88\u591a\u7684\u6a21\u5757\u5df2\u7ecf\u5728\u652f\u6301\uff1a<code>aiohttp<\/code>,<code>aiodns<\/code>,<code>aioredis<\/code>\u7b49\u7b49\u00a0<a href=\"https:\/\/links.jianshu.com\/go?to=https%3A%2F%2Fgithub.com%2Faio-libs\" target=\"_blank\" rel=\"nofollow noopener\">https:\/\/github.com\/aio-libs<\/a>\u00a0\u8fd9\u91cc\u5217\u51fa\u4e86\u5df2\u7ecf\u652f\u6301\u7684\u5185\u5bb9\uff0c\u5e76\u5728\u6301\u7eed\u66f4\u65b0<\/p>\n<p>\u5f53\u7136\u5230\u76ee\u524d\u4e3a\u6b62\u5b9e\u73b0\u534f\u7a0b\u7684\u4e0d\u4ec5\u4ec5\u53ea\u6709<code>asyncio<\/code>\u6a21\u5757\uff0c<code>tornado<\/code>\u548c<code>gevent<\/code>\u90fd\u5b9e\u73b0\u4e86\u7c7b\u4f3c\u529f\u80fd<\/p>\n<p>\u5173\u4e8e<code>asyncio<\/code>\u7684\u4e00\u4e9b\u5173\u952e\u5b57\u7684\u8bf4\u660e\uff1a<\/p>\n<ul>\n<li><code>event_loop<\/code>\u00a0\u4e8b\u4ef6\u5faa\u73af\uff1a\u7a0b\u5e8f\u5f00\u542f\u4e00\u4e2a\u65e0\u9650\u5faa\u73af\uff0c\u628a\u4e00\u4e9b\u51fd\u6570\u6ce8\u518c\u5230\u4e8b\u4ef6\u5faa\u73af\u4e0a\uff0c\u5f53\u6ee1\u8db3\u4e8b\u4ef6\u53d1\u751f\u7684\u65f6\u5019\uff0c\u8c03\u7528\u76f8\u5e94\u7684\u534f\u7a0b\u51fd\u6570<\/li>\n<\/ul>\n<ul>\n<li><code>coroutine<\/code>\u00a0\u534f\u7a0b\uff1a\u534f\u7a0b\u5bf9\u8c61\uff0c\u6307\u4e00\u4e2a\u4f7f\u7528async\u5173\u952e\u5b57\u5b9a\u4e49\u7684\u51fd\u6570\uff0c\u5b83\u7684\u8c03\u7528\u4e0d\u4f1a\u7acb\u5373\u6267\u884c\u51fd\u6570\uff0c\u800c\u662f\u4f1a\u8fd4\u56de\u4e00\u4e2a\u534f\u7a0b\u5bf9\u8c61\u3002\u534f\u7a0b\u5bf9\u8c61\u9700\u8981\u6ce8\u518c\u5230\u4e8b\u4ef6\u5faa\u73af\uff0c\u7531\u4e8b\u4ef6\u5faa\u73af\u8c03\u7528\u3002<\/li>\n<li><code>task<\/code>\u00a0\u4efb\u52a1\uff1a\u4e00\u4e2a\u534f\u7a0b\u5bf9\u8c61\u5c31\u662f\u4e00\u4e2a\u539f\u751f\u53ef\u4ee5\u6302\u8d77\u7684\u51fd\u6570\uff0c\u4efb\u52a1\u5219\u662f\u5bf9\u534f\u7a0b\u8fdb\u4e00\u6b65\u5c01\u88c5\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u4efb\u52a1\u7684\u5404\u79cd\u72b6\u6001<\/li>\n<li><code>future<\/code>: \u4ee3\u8868\u5c06\u6765\u6267\u884c\u6216\u6ca1\u6709\u6267\u884c\u7684\u4efb\u52a1\u7684\u7ed3\u679c\u3002\u5b83\u548ctask\u4e0a\u6ca1\u6709\u672c\u8d28\u4e0a\u7684\u533a\u522b<\/li>\n<\/ul>\n<ul>\n<li><code>async\/await<\/code>\u00a0\u5173\u952e\u5b57\uff1a<code>python3.5<\/code>\u7528\u4e8e\u5b9a\u4e49\u534f\u7a0b\u7684\u5173\u952e\u5b57\uff0c<code>async<\/code>\u5b9a\u4e49\u4e00\u4e2a\u534f\u7a0b\uff0c<code>await<\/code>\u7528\u4e8e\u6302\u8d77\u963b\u585e\u7684\u5f02\u6b65\u8c03\u7528\u63a5\u53e3\u3002<\/li>\n<\/ul>\n<h3>\u5b9a\u4e49\u4e00\u4e2a\u534f\u7a0b<\/h3>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> time\r\n<span class=\"token keyword\">import<\/span> asyncio\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span> x<span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token comment\"># \u8fd9\u91cc\u662f\u4e00\u4e2a\u534f\u7a0b\u5bf9\u8c61\uff0c\u8fd9\u4e2a\u65f6\u5019do_some_work\u51fd\u6570\u5e76\u6ca1\u6709\u6267\u884c<\/span>\r\ncoroutine <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>coroutine<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token comment\">#  \u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6loop<\/span>\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token comment\"># \u5c06\u534f\u7a0b\u52a0\u5165\u5230\u4e8b\u4ef6\u5faa\u73afloop<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>coroutine<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u5728\u4e0a\u9762\u5e26\u4e2d\u6211\u4eec\u901a\u8fc7<code>async<\/code>\u5173\u952e\u5b57\u5b9a\u4e49\u4e00\u4e2a\u534f\u7a0b\uff08<code>coroutine<\/code>\uff09\uff0c\u5f53\u7136\u534f\u7a0b\u4e0d\u80fd\u76f4\u63a5\u8fd0\u884c\uff0c\u9700\u8981\u5c06\u534f\u7a0b\u52a0\u5165\u5230\u4e8b\u4ef6\u5faa\u73af<code>loop<\/code>\u4e2d<\/p>\n<p><code>asyncio.get_event_loop<\/code>\uff1a\u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\uff0c\u7136\u540e\u4f7f\u7528<code>run_until_complete<\/code>\u5c06\u534f\u7a0b\u6ce8\u518c\u5230\u4e8b\u4ef6\u5faa\u73af\uff0c\u5e76\u542f\u52a8\u4e8b\u4ef6\u5faa\u73af<\/p>\n<h3>\u521b\u5efa\u4e00\u4e2atask<\/h3>\n<p>\u534f\u7a0b\u5bf9\u8c61\u4e0d\u80fd\u76f4\u63a5\u8fd0\u884c\uff0c\u5728\u6ce8\u518c\u4e8b\u4ef6\u5faa\u73af\u7684\u65f6\u5019\uff0c\u5176\u5b9e\u662f<code>run_until_complete<\/code>\u65b9\u6cd5\u5c06\u534f\u7a0b\u5305\u88c5\u6210\u4e3a\u4e86\u4e00\u4e2a\u4efb\u52a1\uff08<code>task<\/code>\uff09\u5bf9\u8c61.\u00a0<code>task<\/code>\u5bf9\u8c61\u662f<code>Future<\/code>\u7c7b\u7684\u5b50\u7c7b\uff0c\u4fdd\u5b58\u4e86\u534f\u7a0b\u8fd0\u884c\u540e\u7684\u72b6\u6001\uff0c\u7528\u4e8e\u672a\u6765\u83b7\u53d6\u534f\u7a0b\u7684\u7ed3\u679c<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span> x<span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\ncoroutine <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\ntask <span class=\"token operator\">=<\/span> loop<span class=\"token punctuation\">.<\/span>create_task<span class=\"token punctuation\">(<\/span>coroutine<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u7ed3\u679c\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-jsx\"><code class=\"  language-jsx\"><span class=\"token operator\">&lt;<\/span>Task pending coro<span class=\"token operator\">=<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> running at <span class=\"token operator\">\/<\/span>app<span class=\"token operator\">\/<\/span>py_code<span class=\"token operator\">\/<\/span>study_asyncio<span class=\"token operator\">\/<\/span>simple_ex2<span class=\"token punctuation\">.<\/span>py<span class=\"token punctuation\">:<\/span><span class=\"token number\">13<\/span><span class=\"token operator\">&gt;&gt;<\/span>\r\nwaiting<span class=\"token punctuation\">:<\/span> <span class=\"token number\">2<\/span>\r\n<span class=\"token operator\">&lt;<\/span>Task finished coro<span class=\"token operator\">=<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> done<span class=\"token punctuation\">,<\/span> defined at <span class=\"token operator\">\/<\/span>app<span class=\"token operator\">\/<\/span>py_code<span class=\"token operator\">\/<\/span>study_asyncio<span class=\"token operator\">\/<\/span>simple_ex2<span class=\"token punctuation\">.<\/span>py<span class=\"token punctuation\">:<\/span><span class=\"token number\">13<\/span><span class=\"token operator\">&gt;<\/span> result<span class=\"token operator\">=<\/span>None<span class=\"token operator\">&gt;<\/span>\r\nTime<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.0003514289855957031<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u521b\u5efa<code>task<\/code>\u540e\uff0c\u5728<code>task<\/code>\u52a0\u5165\u4e8b\u4ef6\u5faa\u73af\u4e4b\u524d\u4e3a<code>pending<\/code>\u72b6\u6001\uff0c\u5f53\u5b8c\u6210\u540e\uff0c\u72b6\u6001\u4e3a<code>finished<\/code><\/p>\n<p>\u5173\u4e8e\u4e0a\u9762\u901a\u8fc7<code>loop.create_task(coroutine)<\/code>\u521b\u5efa<code>task<\/code>,\u540c\u6837\u7684\u53ef\u4ee5\u901a\u8fc7\u00a0<code>asyncio.ensure_future(coroutine)<\/code>\u521b\u5efa<code>task<\/code><\/p>\n<p>\u5173\u4e8e\u8fd9\u4e24\u4e2a\u547d\u4ee4\u7684\u5b98\u7f51\u89e3\u91ca\uff1a\u00a0<a href=\"https:\/\/links.jianshu.com\/go?to=https%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Fasyncio-task.html%23asyncio.ensure_future\" target=\"_blank\" rel=\"nofollow noopener\">https:\/\/docs.python.org\/3\/library\/asyncio-task.html#asyncio.ensure_future<\/a><\/p>\n<blockquote><p>asyncio.ensure_future(coro_or_future, *, loop=None)\u00b6<br \/>\nSchedule the execution of a coroutine object: wrap it in a future. Return a Task object.<br \/>\nIf the argument is a Future, it is returned directly.<\/p><\/blockquote>\n<h3>\u7ed1\u5b9a\u56de\u8c03<\/h3>\n<p>\u7ed1\u5b9a\u56de\u8c03\uff0c\u5728<code>task<\/code>\u6267\u884c\u5b8c\u6210\u7684\u65f6\u5019\u53ef\u4ee5\u83b7\u53d6\u6267\u884c\u7684\u7ed3\u679c\uff0c\u56de\u8c03\u7684\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u662f<code>future<\/code>\u5bf9\u8c61\uff0c\u901a\u8fc7\u8be5\u5bf9\u8c61\u53ef\u4ee5\u83b7\u53d6\u534f\u7a0b\u8fd4\u56de\u503c\u3002<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> time\r\n<span class=\"token keyword\">import<\/span> asyncio\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">callback<\/span><span class=\"token punctuation\">(<\/span>future<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"callback:\"<\/span><span class=\"token punctuation\">,<\/span>future<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\ncoroutine <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\ntask <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\ntask<span class=\"token punctuation\">.<\/span>add_done_callback<span class=\"token punctuation\">(<\/span>callback<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u7ed3\u679c\u4e3a\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-jsx\"><code class=\"  language-jsx\"><span class=\"token operator\">&lt;<\/span>Task pending coro<span class=\"token operator\">=<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> running at <span class=\"token operator\">\/<\/span>app<span class=\"token operator\">\/<\/span>py_code<span class=\"token operator\">\/<\/span>study_asyncio<span class=\"token operator\">\/<\/span>simple_ex3<span class=\"token punctuation\">.<\/span>py<span class=\"token punctuation\">:<\/span><span class=\"token number\">13<\/span><span class=\"token operator\">&gt;&gt;<\/span>\r\n<span class=\"token operator\">&lt;<\/span>Task pending coro<span class=\"token operator\">=<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> running at <span class=\"token operator\">\/<\/span>app<span class=\"token operator\">\/<\/span>py_code<span class=\"token operator\">\/<\/span>study_asyncio<span class=\"token operator\">\/<\/span>simple_ex3<span class=\"token punctuation\">.<\/span>py<span class=\"token punctuation\">:<\/span><span class=\"token number\">13<\/span><span class=\"token operator\">&gt;<\/span> cb<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token function\">callback<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> at <span class=\"token operator\">\/<\/span>app<span class=\"token operator\">\/<\/span>py_code<span class=\"token operator\">\/<\/span>study_asyncio<span class=\"token operator\">\/<\/span>simple_ex3<span class=\"token punctuation\">.<\/span>py<span class=\"token punctuation\">:<\/span><span class=\"token number\">18<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">&gt;<\/span>\r\nwaiting<span class=\"token punctuation\">:<\/span> <span class=\"token number\">2<\/span>\r\ncallback<span class=\"token punctuation\">:<\/span> Done after <span class=\"token number\">2<\/span>s\r\nTime<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0.00039196014404296875<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u901a\u8fc7<code>add_done_callback<\/code>\u65b9\u6cd5\u7ed9<code>task<\/code>\u4efb\u52a1\u6dfb\u52a0\u56de\u8c03\u51fd\u6570\uff0c\u5f53<code>task<\/code>\uff08\u4e5f\u53ef\u4ee5\u8bf4\u662f<code>coroutine<\/code>\uff09\u6267\u884c\u5b8c\u6210\u7684\u65f6\u5019,\u5c31\u4f1a\u8c03\u7528\u56de\u8c03\u51fd\u6570\u3002\u5e76\u901a\u8fc7\u53c2\u6570<code>future<\/code>\u83b7\u53d6\u534f\u7a0b\u6267\u884c\u7684\u7ed3\u679c\u3002\u8fd9\u91cc\u6211\u4eec\u521b\u5efa \u7684<code>task<\/code>\u548c\u56de\u8c03\u91cc\u7684<code>future<\/code>\u5bf9\u8c61\u5b9e\u9645\u4e0a\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61<\/p>\n<h3>\u963b\u585e\u548cawait<\/h3>\n<p>\u4f7f\u7528<code>async<\/code>\u53ef\u4ee5\u5b9a\u4e49\u534f\u7a0b\u5bf9\u8c61\uff0c\u4f7f\u7528<code>await<\/code>\u53ef\u4ee5\u9488\u5bf9\u8017\u65f6\u7684\u64cd\u4f5c\u8fdb\u884c\u6302\u8d77\uff0c\u5c31\u50cf\u751f\u6210\u5668\u91cc\u7684<code>yield<\/code>\u4e00\u6837\uff0c\u51fd\u6570\u8ba9\u51fa\u63a7\u5236\u6743\u3002\u534f\u7a0b\u9047\u5230<code>await<\/code>\uff0c\u4e8b\u4ef6\u5faa\u73af\u5c06\u4f1a\u6302\u8d77\u8be5\u534f\u7a0b\uff0c\u6267\u884c\u522b\u7684\u534f\u7a0b\uff0c\u76f4\u5230\u5176\u4ed6\u7684\u534f\u7a0b\u4e5f\u6302\u8d77\u6216\u8005\u6267\u884c\u5b8c\u6bd5\uff0c\u518d\u8fdb\u884c\u4e0b\u4e00\u4e2a\u534f\u7a0b\u7684\u6267\u884c<\/p>\n<p>\u8017\u65f6\u7684\u64cd\u4f5c\u4e00\u822c\u662f\u4e00\u4e9bIO\u64cd\u4f5c\uff0c\u4f8b\u5982\u7f51\u7edc\u8bf7\u6c42\uff0c\u6587\u4ef6\u8bfb\u53d6\u7b49\u3002\u6211\u4eec\u4f7f\u7528<code>asyncio.sleep<\/code>\u51fd\u6570\u6765\u6a21\u62dfIO\u64cd\u4f5c\u3002\u534f\u7a0b\u7684\u76ee\u7684\u4e5f\u662f\u8ba9\u8fd9\u4e9bIO\u64cd\u4f5c\u5f02\u6b65\u5316\u3002<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token comment\"># await \u540e\u9762\u5c31\u662f\u8c03\u7528\u8017\u65f6\u7684\u64cd\u4f5c<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\ncoroutine <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\ntask <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine<span class=\"token punctuation\">)<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span> start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u7ed3\u679c\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-css\"><code class=\"  language-css\"><span class=\"token property\">waiting<\/span><span class=\"token punctuation\">:<\/span> 2\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 2s\r\n<span class=\"token property\">Time<\/span><span class=\"token punctuation\">:<\/span> 2.012403726577759\r\n<\/code><\/pre>\n<\/div>\n<p>\u5728<code>await asyncio.sleep(x)<\/code>\uff0c\u56e0\u4e3a\u8fd9\u91cc<code>sleep<\/code>\u4e86\uff0c\u6a21\u62df\u4e86\u963b\u585e\u6216\u8005\u8017\u65f6\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u65f6\u5019\u5c31\u4f1a\u8ba9\u51fa\u63a7\u5236\u6743\u3002 \u5373\u5f53\u9047\u5230\u963b\u585e\u8c03\u7528\u7684\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f7f\u7528<code>await<\/code>\u65b9\u6cd5\u5c06\u534f\u7a0b\u7684\u63a7\u5236\u6743\u8ba9\u51fa,\u4ee5\u4fbf<code>loop<\/code>\u8c03\u7528\u5176\u4ed6\u7684\u534f\u7a0b\u3002<\/p>\n<h3>\u5e76\u53d1\u548c\u5e76\u884c<\/h3>\n<p>\u5e76\u53d1\u6307\u7684\u662f\u540c\u65f6\u5177\u6709\u591a\u4e2a\u6d3b\u52a8\u7684\u7cfb\u7edf<\/p>\n<p>\u5e76\u884c\u6307\u7684\u662f\u7528\u5e76\u53d1\u6765\u4f7f\u4e00\u4e2a\u7cfb\u7edf\u8fd0\u884c\u7684\u66f4\u5feb\u3002\u5e76\u884c\u53ef\u4ee5\u5728\u64cd\u4f5c\u7cfb\u7edf\u7684\u591a\u4e2a\u62bd\u8c61\u5c42\u6b21\u8fdb\u884c\u8fd0\u7528<\/p>\n<p>\u6240\u4ee5\u5e76\u53d1\u901a\u5e38\u662f\u6307\u6709\u591a\u4e2a\u4efb\u52a1\u9700\u8981\u540c\u65f6\u8fdb\u884c\uff0c\u5e76\u884c\u5219\u662f\u540c\u4e00\u4e2a\u65f6\u523b\u6709\u591a\u4e2a\u4efb\u52a1\u6267\u884c<\/p>\n<p>\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\u975e\u5e38\u5f62\u8c61\uff1a<\/p>\n<p>\u5e76\u53d1\u60c5\u51b5\u4e0b\u662f\u4e00\u4e2a\u8001\u5e08\u5728\u540c\u4e00\u65f6\u95f4\u6bb5\u8f85\u52a9\u4e0d\u540c\u7684\u4eba\u529f\u8bfe\u3002\u5e76\u884c\u5219\u662f\u6307\u591a\u4e2a\u8001\u5e08\u5206\u522b\u540c\u65f6\u8f85\u52a9\u591a\u4e2a\u5b66\u751f\u529f\u8bfe\u3002\u7b80\u800c\u8a00\u4e4b\u5c31\u662f\u4e00\u4e2a\u4eba\u540c\u65f6\u5403\u4e09\u4e2a\u9992\u5934\u8fd8\u662f\u4e09\u4e2a\u4eba\u6bcf\u4eba\u540c\u65f6\u5403\u4e00\u4e2a\u7684\u60c5\u51b5\uff0c\u5403\u4e00\u4e2a\u9992\u5934\u7b97\u4e00\u4e2a\u4efb\u52a1<\/p>\n<h6>\u4f7f\u7528<code>asyncio<\/code>\u5b9e\u73b0\u5e76\u53d1<\/h6>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\ncoroutine1 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\ncoroutine2 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\ncoroutine3 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\ntasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine3<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">]<\/span>\r\n\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>asyncio<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>tasks<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">for<\/span> task <span class=\"token keyword\">in<\/span> tasks<span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span>task<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u8fd0\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-css\"><code class=\"  language-css\"><span class=\"token property\">Waiting<\/span><span class=\"token punctuation\">:<\/span> 1\r\n<span class=\"token property\">Waiting<\/span><span class=\"token punctuation\">:<\/span> 2\r\n<span class=\"token property\">Waiting<\/span><span class=\"token punctuation\">:<\/span> 4\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 1s\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 2s\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 4s\r\n<span class=\"token property\">Time<\/span><span class=\"token punctuation\">:<\/span> 4.004154920578003\r\n<\/code><\/pre>\n<\/div>\n<p>\u603b\u65f6\u95f4\u4e3a4s\u5de6\u53f3\u30024s\u7684\u963b\u585e\u65f6\u95f4\uff0c\u8db3\u591f\u524d\u9762\u4e24\u4e2a\u534f\u7a0b\u6267\u884c\u5b8c\u6bd5\u3002\u5982\u679c\u662f\u540c\u6b65\u987a\u5e8f\u7684\u4efb\u52a1\uff0c\u90a3\u4e48\u81f3\u5c11\u9700\u89817s\u3002\u6b64\u65f6\u6211\u4eec\u4f7f\u7528\u4e86<code>aysncio<\/code>\u5b9e\u73b0\u4e86\u5e76\u53d1\u3002<code>asyncio.wait(tasks)<\/code>\u00a0\u4e5f\u53ef\u4ee5\u4f7f\u7528\u00a0<code>asyncio.gather(*tasks)<\/code>\u00a0,\u524d\u8005\u63a5\u53d7\u4e00\u4e2a<code>task<\/code>\u5217\u8868\uff0c\u540e\u8005\u63a5\u6536\u4e00\u5806<code>task<\/code>\u3002<\/p>\n<p>\u5173\u4e8e<code>asyncio.gather<\/code>\u548c<code>asyncio.wait<\/code>\u5b98\u7f51\u7684\u8bf4\u660e\uff1a<\/p>\n<p><code>asyncio.gather<\/code><br \/>\nReturn a future aggregating results from the given coroutine objects or futures.<br \/>\nAll futures must share the same event loop. If all the tasks are done successfully, the returned future\u2019s result is the list of results (in the order of the original sequence, not necessarily the order of results arrival). If return_exceptions is true, exceptions in the tasks are treated the same as successful results, and gathered in the result list; otherwise, the first raised exception will be immediately propagated to the returned future.<\/p>\n<p><code>asyncio.wait<\/code><br \/>\nWait for the Futures and coroutine objects given by the sequence futures to complete. Coroutines will be wrapped in Tasks. Returns two sets of Future: (done, pending).<br \/>\nThe sequence futures must not be empty.<br \/>\ntimeout can be used to control the maximum number of seconds to wait before returning. timeout can be an int or float. If timeout is not specified or None, there is no limit to the wait time.<br \/>\nreturn_when indicates when this function should return.<\/p>\n<h3>\u534f\u7a0b\u5d4c\u5957<\/h3>\n<p>\u4f7f\u7528<code>async<\/code>\u53ef\u4ee5\u5b9a\u4e49\u534f\u7a0b\uff0c\u534f\u7a0b\u7528\u4e8e\u8017\u65f6\u7684io\u64cd\u4f5c\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5c01\u88c5\u66f4\u591a\u7684io\u64cd\u4f5c\u8fc7\u7a0b\uff0c\u8fd9\u6837\u5c31\u5b9e\u73b0\u4e86\u5d4c\u5957\u7684\u534f\u7a0b\uff0c\u5373\u4e00\u4e2a\u534f\u7a0b\u4e2d<code>await<\/code>\u4e86\u53e6\u5916\u4e00\u4e2a\u534f\u7a0b\uff0c\u5982\u6b64\u8fde\u63a5\u8d77\u6765\u3002<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    coroutine1 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine2 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine3 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span>\r\n    tasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine3<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">]<\/span>\r\n\r\n    dones<span class=\"token punctuation\">,<\/span> pendings <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>tasks<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">for<\/span> task <span class=\"token keyword\">in<\/span> dones<span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n    <span class=\"token comment\"># results = await asyncio.gather(*tasks)<\/span>\r\n    <span class=\"token comment\"># for result in results:<\/span>\r\n    <span class=\"token comment\">#     print(\"Task ret:\",result)<\/span>\r\n\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u7ed3\u679c\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-css\"><code class=\"  language-css\"><span class=\"token property\">waiting<\/span><span class=\"token punctuation\">:<\/span> 1\r\n<span class=\"token property\">waiting<\/span><span class=\"token punctuation\">:<\/span> 2\r\n<span class=\"token property\">waiting<\/span><span class=\"token punctuation\">:<\/span> 4\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 1s\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 2s\r\nTask <span class=\"token property\">ret<\/span><span class=\"token punctuation\">:<\/span> Done after 4s\r\n<span class=\"token property\">Time<\/span><span class=\"token punctuation\">:<\/span> 4.02480673789978\r\n<\/code><\/pre>\n<\/div>\n<p>\u5982\u679c\u628a\u4e0a\u9762\u4ee3\u7801\u4e2d\u7684\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-dart\"><code class=\"  language-dart\">    dones<span class=\"token punctuation\">,<\/span> pendings <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span><span class=\"token function\">wait<\/span><span class=\"token punctuation\">(<\/span>tasks<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">for<\/span> task <span class=\"token keyword\">in<\/span> dones<span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token function\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span> task<span class=\"token punctuation\">.<\/span><span class=\"token function\">result<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u66ff\u6362\u4e3a\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-dart\"><code class=\"  language-dart\">    results <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span><span class=\"token function\">gather<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>tasks<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">for<\/span> result <span class=\"token keyword\">in<\/span> results<span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token function\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span>result<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u8fd9\u6837\u5f97\u5230\u7684\u5c31\u662f\u4e00\u4e2a\u7ed3\u679c\u7684\u5217\u8868<\/p>\n<p>\u4e0d\u5728<code>main<\/code>\u534f\u7a0b\u51fd\u6570\u91cc\u5904\u7406\u7ed3\u679c\uff0c\u76f4\u63a5\u8fd4\u56de<code>await<\/code>\u7684\u5185\u5bb9\uff0c\u90a3\u4e48\u6700\u5916\u5c42\u7684<code>run_until_complete<\/code>\u5c06\u4f1a\u8fd4\u56de<code>main<\/code>\u534f\u7a0b\u7684\u7ed3\u679c\u3002 \u5c06\u4e0a\u8ff0\u7684\u4ee3\u7801\u66f4\u6539\u4e3a\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    coroutine1 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine2 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine3 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span>\r\n    tasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine3<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>gather<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>tasks<span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nresults <span class=\"token operator\">=<\/span> loop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">for<\/span> result <span class=\"token keyword\">in<\/span> results<span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span>result<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u6216\u8005\u8fd4\u56de\u4f7f\u7528<code>asyncio.wait<\/code>\u65b9\u5f0f\u6302\u8d77\u534f\u7a0b\u3002<\/p>\n<p>\u5c06\u4ee3\u7801\u66f4\u6539\u4e3a\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    coroutine1 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine2 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine3 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span>\r\n    tasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine3<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>tasks<span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\ndone<span class=\"token punctuation\">,<\/span>pending <span class=\"token operator\">=<\/span> loop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">for<\/span> task <span class=\"token keyword\">in<\/span> done<span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret:\"<\/span><span class=\"token punctuation\">,<\/span>task<span class=\"token punctuation\">.<\/span>result<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u4e5f\u53ef\u4ee5\u4f7f\u7528<code>asyncio<\/code>\u7684<code>as_completed<\/code>\u65b9\u6cd5<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    coroutine1 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine2 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\n    coroutine3 <span class=\"token operator\">=<\/span> do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span>\r\n    tasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine3<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">for<\/span> task <span class=\"token keyword\">in<\/span> asyncio<span class=\"token punctuation\">.<\/span>as_completed<span class=\"token punctuation\">(<\/span>tasks<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n        result <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> task\r\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Task ret: {}\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nloop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u4ece\u4e0a\u9762\u4e5f\u53ef\u4ee5\u770b\u51fa\uff0c\u534f\u7a0b\u7684\u8c03\u7528\u548c\u7ec4\u5408\u975e\u5e38\u7075\u6d3b\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\u5bf9\u4e8e\u7ed3\u679c\u7684\u5904\u7406\uff1a\u5982\u4f55\u8fd4\u56de\uff0c\u5982\u4f55\u6302\u8d77<\/p>\n<h3>\u534f\u7a0b\u7684\u505c\u6b62<\/h3>\n<p><code>future<\/code>\u5bf9\u8c61\u6709\u51e0\u4e2a\u72b6\u6001\uff1a<\/p>\n<ul>\n<li><code>Pending<\/code><\/li>\n<li><code>Running<\/code><\/li>\n<li><code>Done<\/code><\/li>\n<li><code>Cacelled<\/code><\/li>\n<\/ul>\n<p>\u521b\u5efa<code>future<\/code>\u7684\u65f6\u5019\uff0c<code>task<\/code>\u4e3a<code>pending<\/code>\uff0c\u4e8b\u4ef6\u5faa\u73af\u8c03\u7528\u6267\u884c\u7684\u65f6\u5019\u5f53\u7136\u5c31\u662f<code>running<\/code>\uff0c\u8c03\u7528\u5b8c\u6bd5\u81ea\u7136\u5c31\u662f<code>done<\/code>\uff0c\u5982\u679c\u9700\u8981\u505c\u6b62\u4e8b\u4ef6\u5faa\u73af\uff0c\u5c31\u9700\u8981\u5148\u628a<code>task<\/code>\u53d6\u6d88\u3002\u53ef\u4ee5\u4f7f\u7528<code>asyncio.Task<\/code>\u83b7\u53d6\u4e8b\u4ef6\u5faa\u73af\u7684<code>task<\/code><\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Waiting:\"<\/span><span class=\"token punctuation\">,<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">\"Done after {}s\"<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n\r\ncoroutine1 <span class=\"token operator\">=<\/span>do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\ncoroutine2 <span class=\"token operator\">=<\/span>do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\ncoroutine3 <span class=\"token operator\">=<\/span>do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\ntasks <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>coroutine3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">]<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nloop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>get_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span>\r\n    loop<span class=\"token punctuation\">.<\/span>run_until_complete<span class=\"token punctuation\">(<\/span>asyncio<span class=\"token punctuation\">.<\/span>wait<span class=\"token punctuation\">(<\/span>tasks<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">except<\/span> KeyboardInterrupt <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>asyncio<span class=\"token punctuation\">.<\/span>Task<span class=\"token punctuation\">.<\/span>all_tasks<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">for<\/span> task <span class=\"token keyword\">in<\/span> asyncio<span class=\"token punctuation\">.<\/span>Task<span class=\"token punctuation\">.<\/span>all_tasks<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">.<\/span>cancel<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    loop<span class=\"token punctuation\">.<\/span>stop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    loop<span class=\"token punctuation\">.<\/span>run_forever<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span>\r\n    loop<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Time:\"<\/span><span class=\"token punctuation\">,<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-<\/span>start<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u542f\u52a8\u4e8b\u4ef6\u5faa\u73af\u4e4b\u540e\uff0c\u9a6c\u4e0a ctrl+c\uff0c\u4f1a\u89e6\u53d1<code>run_until_complete<\/code>\u7684\u6267\u884c\u5f02\u5e38\u00a0<code>KeyBorardInterrupt<\/code>\u3002\u7136\u540e\u901a\u8fc7\u5faa\u73af<code>asyncio.Task<\/code>\u53d6\u6d88<code>future<\/code>\u3002\u53ef\u4ee5\u770b\u5230\u8f93\u51fa\u5982\u4e0b\uff1a<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-bash\"><code class=\"  language-bash\">Waiting: 1\r\nWaiting: 2\r\nWaiting: 2\r\n^C{&lt;Task finished coro=&lt;do_some_work() done, defined at \/app\/py_code\/study_asyncio\/simple_ex10.py:13&gt; result='Done after 1s'&gt;, &lt;Task pending coro=&lt;do_some_work() running at \/app\/py_code\/study_asyncio\/simple_ex10.py:15&gt; wait_for=&lt;Future pending cb=[Task._wakeup()]&gt; cb=[_wait.&lt;locals&gt;._on_completion() at \/usr\/local\/lib\/python3.5\/asyncio\/tasks.py:428]&gt;, &lt;Task pending coro=&lt;do_some_work() running at \/app\/py_code\/study_asyncio\/simple_ex10.py:15&gt; wait_for=&lt;Future pending cb=[Task._wakeup()]&gt; cb=[_wait.&lt;locals&gt;._on_completion() at \/usr\/local\/lib\/python3.5\/asyncio\/tasks.py:428]&gt;, &lt;Task pending coro=&lt;wait() running at \/usr\/local\/lib\/python3.5\/asyncio\/tasks.py:361&gt; wait_for=&lt;Future pending cb=[Task._wakeup()]&gt;&gt;}\r\nFalse\r\nTrue\r\nTrue\r\nTrue\r\nTime: 1.0707225799560547\r\n<\/code><\/pre>\n<\/div>\n<p><code>True<\/code>\u8868\u793a<code>cannel<\/code>\u6210\u529f\uff0c<code>loop.stop<\/code>\u4e4b\u540e\u8fd8\u9700\u8981\u518d\u6b21\u5f00\u542f\u4e8b\u4ef6\u5faa\u73af\uff0c\u6700\u540e\u5728<code>close<\/code>\uff0c\u4e0d\u7136\u8fd8\u4f1a\u629b\u51fa\u5f02\u5e38<\/p>\n<p>\u5faa\u73af<code>task<\/code>\uff0c\u9010\u4e2a<code>cancel<\/code>\u662f\u4e00\u79cd\u65b9\u6848\uff0c\u53ef\u662f\u6b63\u5982\u4e0a\u9762\u6211\u4eec\u628a<code>task<\/code>\u7684\u5217\u8868\u5c01\u88c5\u5728<code>main<\/code>\u51fd\u6570\u4e2d\uff0c<code>main<\/code>\u51fd\u6570\u5916\u8fdb\u884c\u4e8b\u4ef6\u5faa\u73af\u7684\u8c03\u7528\u3002\u8fd9\u4e2a\u65f6\u5019\uff0c<code>main<\/code>\u76f8\u5f53\u4e8e\u6700\u5916\u51fa\u7684\u4e00\u4e2a<code>task<\/code>\uff0c\u90a3\u4e48\u5904\u7406\u5305\u88c5\u7684<code>main<\/code>\u51fd\u6570\u5373\u53ef\u3002<\/p>\n<h3>\u4e0d\u540c\u7ebf\u7a0b\u7684\u4e8b\u4ef6\u5faa\u73af<\/h3>\n<p>\u5f88\u591a\u65f6\u5019\uff0c\u6211\u4eec\u7684\u4e8b\u4ef6\u5faa\u73af\u7528\u4e8e\u6ce8\u518c\u534f\u7a0b\uff0c\u800c\u6709\u7684\u534f\u7a0b\u9700\u8981\u52a8\u6001\u7684\u6dfb\u52a0\u5230\u4e8b\u4ef6\u5faa\u73af\u4e2d\u3002\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u5f0f\u5c31\u662f\u4f7f\u7528\u591a\u7ebf\u7a0b\u3002\u5f53\u524d\u7ebf\u7a0b\u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\uff0c\u7136\u540e\u5728\u65b0\u5efa\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u5728\u65b0\u7ebf\u7a0b\u4e2d\u542f\u52a8\u4e8b\u4ef6\u5faa\u73af\u3002\u5f53\u524d\u7ebf\u7a0b\u4e0d\u4f1a\u88ab<code>block(\u963b\u585e)<\/code>\u3002<\/p>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">from<\/span> threading <span class=\"token keyword\">import<\/span> Thread\r\n<span class=\"token keyword\">import<\/span> time\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">start_loop<\/span><span class=\"token punctuation\">(<\/span>loop<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>set_event_loop<span class=\"token punctuation\">(<\/span>loop<span class=\"token punctuation\">)<\/span>\r\n    loop<span class=\"token punctuation\">.<\/span>run_forever<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">more_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'More work {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Finished more work {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nnew_loop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>new_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nt <span class=\"token operator\">=<\/span> Thread<span class=\"token punctuation\">(<\/span>target<span class=\"token operator\">=<\/span>start_loop<span class=\"token punctuation\">,<\/span> args<span class=\"token operator\">=<\/span><span class=\"token punctuation\">(<\/span>new_loop<span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\nt<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'TIME: {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nnew_loop<span class=\"token punctuation\">.<\/span>call_soon_threadsafe<span class=\"token punctuation\">(<\/span>more_work<span class=\"token punctuation\">,<\/span> <span class=\"token number\">6<\/span><span class=\"token punctuation\">)<\/span>\r\nnew_loop<span class=\"token punctuation\">.<\/span>call_soon_threadsafe<span class=\"token punctuation\">(<\/span>more_work<span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u542f\u52a8\u4e0a\u8ff0\u4ee3\u7801\u4e4b\u540e\uff0c\u5f53\u524d\u7ebf\u7a0b\u4e0d\u4f1a\u88ab<code>block<\/code>\uff0c\u65b0\u7ebf\u7a0b\u4e2d\u4f1a\u6309\u7167\u987a\u5e8f\u6267\u884c<code>call_soon_threadsafe<\/code>\u65b9\u6cd5\u6ce8\u518c\u7684<code>more_work<\/code>\u65b9\u6cd5\uff0c \u540e\u8005\u56e0\u4e3a<code>time.sleep<\/code>\u64cd\u4f5c\u662f\u540c\u6b65\u963b\u585e\u7684\uff0c\u56e0\u6b64\u8fd0\u884c\u5b8c\u6bd5<code>more_work<\/code>\u9700\u8981\u5927\u81f46 + 3<\/p>\n<h3>\u65b0\u7ebf\u7a0b\u534f\u7a0b<\/h3>\n<div class=\"_2Uzcx_\"><button class=\"VJbwyy\" type=\"button\" aria-label=\"\u590d\u5236\u4ee3\u7801\"><i class=\"anticon anticon-copy\" aria-label=\"icon: copy\"><\/i><\/button><\/p>\n<pre class=\"line-numbers  language-python\"><code class=\"  language-python\"><span class=\"token keyword\">import<\/span> asyncio\r\n<span class=\"token keyword\">import<\/span> time\r\n<span class=\"token keyword\">from<\/span> threading <span class=\"token keyword\">import<\/span> Thread\r\n\r\nnow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">lambda<\/span> <span class=\"token punctuation\">:<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">start_loop<\/span><span class=\"token punctuation\">(<\/span>loop<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    asyncio<span class=\"token punctuation\">.<\/span>set_event_loop<span class=\"token punctuation\">(<\/span>loop<span class=\"token punctuation\">)<\/span>\r\n    loop<span class=\"token punctuation\">.<\/span>run_forever<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">do_some_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Waiting {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Done after {}s'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">more_work<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'More work {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Finished more work {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nstart <span class=\"token operator\">=<\/span> now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nnew_loop <span class=\"token operator\">=<\/span> asyncio<span class=\"token punctuation\">.<\/span>new_event_loop<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\nt <span class=\"token operator\">=<\/span> Thread<span class=\"token punctuation\">(<\/span>target<span class=\"token operator\">=<\/span>start_loop<span class=\"token punctuation\">,<\/span> args<span class=\"token operator\">=<\/span><span class=\"token punctuation\">(<\/span>new_loop<span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\nt<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'TIME: {}'<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">format<\/span><span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\nasyncio<span class=\"token punctuation\">.<\/span>run_coroutine_threadsafe<span class=\"token punctuation\">(<\/span>do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> new_loop<span class=\"token punctuation\">)<\/span>\r\nasyncio<span class=\"token punctuation\">.<\/span>run_coroutine_threadsafe<span class=\"token punctuation\">(<\/span>do_some_work<span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> new_loop<span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u4e0a\u8ff0\u7684\u4f8b\u5b50\uff0c\u4e3b\u7ebf\u7a0b\u4e2d\u521b\u5efa\u4e00\u4e2a<code>new_loop<\/code>\uff0c\u7136\u540e\u5728\u53e6\u5916\u7684\u5b50\u7ebf\u7a0b\u4e2d\u5f00\u542f\u4e00\u4e2a\u65e0\u9650\u4e8b\u4ef6\u5faa\u73af\u3002 \u4e3b\u7ebf\u7a0b\u901a\u8fc7<code>run_coroutine_threadsafe<\/code>\u65b0\u6ce8\u518c\u534f\u7a0b\u5bf9\u8c61\u3002\u8fd9\u6837\u5c31\u80fd\u5728\u5b50\u7ebf\u7a0b\u4e2d\u8fdb\u884c\u4e8b\u4ef6\u5faa\u73af\u7684\u5e76\u53d1\u64cd\u4f5c\uff0c\u540c\u65f6\u4e3b\u7ebf\u7a0b\u53c8\u4e0d\u4f1a\u88ab<code>block<\/code>\u3002\u4e00\u5171\u6267\u884c\u7684\u65f6\u95f4\u5927\u6982\u57286s\u5de6\u53f3\u3002<\/p>\n<\/article>\n<div><\/div>\n<div class=\"_1kCBjS\">\n<div class=\"_18vaTa\">\n<div class=\"_3BUZPB\">\n<div class=\"_2Bo4Th\" tabindex=\"-1\" role=\"button\" aria-label=\"\u7ed9\u6587\u7ae0\u70b9\u8d5e\"><\/div>\n<p><span class=\"_1LOh_5\" tabindex=\"-1\" role=\"button\" aria-label=\"\u67e5\u770b\u70b9\u8d5e\u5217\u8868\">10\u4eba\u70b9\u8d5e<i class=\"anticon anticon-right\" aria-label=\"icon: right\"><\/i><\/span><\/div>\n<div class=\"_3BUZPB\">\n<div class=\"_2Bo4Th\" tabindex=\"-1\" role=\"button\"><\/div>\n<\/div>\n<\/div>\n<div class=\"_18vaTa\"><a class=\"_3BUZPB _1x1ok9 _1OhGeD\" href=\"https:\/\/www.jianshu.com\/nb\/36152671\" target=\"_blank\" rel=\"noopener noreferrer\"><i class=\"anticon\" aria-label=\"ic-notebook\"><\/i>\u591a\u7ebf\u7a0b\u3001\u534f\u7a0b\u3001\u5f02\u6b65\u3001\u5e76\u53d1<\/a><\/p>\n<div class=\"_3BUZPB ant-dropdown-trigger\">\n<div class=\"_2Bo4Th\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 asyncio \u662f\u5e72\u4ec0\u4e48\u7684\uff1f <\/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-4976","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4976","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=4976"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4976\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=4976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=4976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=4976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}