

{"id":165,"date":"2021-07-06T21:22:18","date_gmt":"2021-07-06T13:22:18","guid":{"rendered":"https:\/\/www.52dixiaowo.com\/python\/?p=165"},"modified":"2021-08-29T17:38:31","modified_gmt":"2021-08-29T09:38:31","slug":"python%e7%9a%84%e5%8d%8f%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/www.52dixiaowo.com\/python\/post-165.html","title":{"rendered":"python\u7684\u534f\u7a0b"},"content":{"rendered":"\n<p>\u534f\u7a0b, \u4e0d\u662f\u7ebf\u7a0b, \u4e5f\u4e0d\u662f\u8fdb\u7a0b, \u5b83\u4e5f\u80fd\u5b9e\u73b0\u591a\u4efb\u52a1<\/p>\n\n\n\n<p>\u4f46\u4ece\u6280\u672f\u672c\u8eab\u6765\u8bf4, \u5b83\u662f&#8221;\u5355\u8fdb\u7a0b, \u5355\u7ebf\u7a0b&#8221;\u7684, \u5b83\u662f\u4e00\u79cd\u5de7\u5999\u7684\u51fd\u6570\u5c01\u88c5\u6280\u672f<\/p>\n\n\n\n<p>\u4f8b\u5982, \u6709\u4e00\u4e2a\u5947\u6570\u5217\u8868, \u4e0d\u65ad\u7684\u53d6\u503c\u662f 1, 3, 5, 7&#8230; , \u6709\u4e00\u4e2a\u5076\u6570\u5217\u8868, \u4e0d\u65ad\u53d6\u503c\u662f 2, 4, 6, 8&#8230; \u90a3\u4e48\u60f3\u8981\u540c\u65f6\u53d6\u503c, \u53ef\u4ee5\u4f7f\u7528\u591a\u7ebf\u7a0b\u6216\u591a\u8fdb\u7a0b\u6765\u5b9e\u73b0, \u800c\u534f\u7a0b\u4e5f\u53ef\u4ee5\u8ba9\u5b83\u4eec\u770b\u8d77\u6765\u662f&#8221;\u591a\u4efb\u52a1&#8221;, \u5373\u53d6\u4e00\u4e2a\u5947\u6570, \u53d6\u4e00\u4e2a\u5076\u6570<\/p>\n\n\n\n<h2>\u624b\u52a8\u5b9e\u73b0\u534f\u7a0b<\/h2>\n\n\n\n<p>\u534f\u7a0b, \u5e76\u975e\u64cd\u4f5c\u7cfb\u7edf\u5b9e\u73b0\u7684, \u800c\u662f\u7f16\u7a0b\u4eba\u5458\u7528\u4ee3\u7801\u5b9e\u73b0\u7684, \u4ece\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u770b\u5e76\u975e\u591a\u4efb\u52a1, \u5355\u4ece\u7528\u6237\u89d2\u5ea6\u662f\u591a\u4efb\u52a1, \u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gl_num1 = &#91;1, 3, 5]\ngl_num2 = &#91;2, 4, 6]\ncurrent_a = 0\ncurrent_b = 0\n\n\ndef next_a():\n    try:\n        global current_a\n        num1 = gl_num1&#91;current_a]\n        current_a += 1\n        return num1\n    except Exception as ex:\n        return -1\n\n\ndef next_b():\n    try:\n        global current_b\n        num2 = gl_num2&#91;current_b]\n        current_b += 1\n        return num2\n    except Exception as ex:\n        return -1\n\n\ndef coroutine_a():\n    \"\"\"\u53d6a\u5217\u8868\"\"\"\n    while True:\n        num1 = next_a()\n        if num1 == -1:\n            break\n        print(num1)\n\n\ndef coroutine_b():\n    \"\"\"\u53d6b\u5217\u8868\"\"\"\n    while True:\n        num2 = next_b()\n        if num2 == -1:\n            break\n        print(num2)\n\n\ndef coroutine():\n    \"\"\"\u53d6\u4e00\u4e2aa, \u53d6\u4e00\u4e2ab\"\"\"\n    while True:\n        a = next_a()\n        if a == -1:\n            break\n        print(a)\n        b = next_b()\n        if b == -1:\n            break\n        print(b)\n\n\ndef main():\n    # coroutine_a()   # 1, 3, 5\n    # coroutine_b()   # 2, 4, 6\n    coroutine()       # 1, 2, 3, 4, 5, 6\n\n\nif __name__ == \"__main__\":\n    main()<\/code><\/pre>\n\n\n\n<p>\u534f\u7a0b\u6bd4\u7ebf\u7a0b, \u8fdb\u7a0b\u6d88\u8017\u7684\u66f4\u5c11, \u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u662f\u4e00\u4e2a\u597d\u9009\u62e9<\/p>\n\n\n\n<h2>yield\u5b9e\u73b0\u534f\u7a0b<\/h2>\n\n\n\n<p>\u663e\u7136, \u8fd9\u6837\u7684\u5c01\u88c5\u592a\u4f9d\u8d56\u4e8e\u6280\u5de7, \u800cpython\u4e2d, \u901a\u8fc7\u524d\u9762\u5b66\u4e60\u7684yield\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import time\n\n\ndef task_1():\n    while True:\n        print(\"---1---\")\n        time.sleep(1)\n        yield\n\n\ndef task_2():\n    while True:\n        print(\"---2---\")\n        time.sleep(1)\n        yield\n\n\ndef main():\n    t1 = task_1()\n    t2 = task_2()\n    while True:\n        next(t1)\n        next(t2)\n\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n\n\n\n<h2>greenlet\u5b9e\u73b0\u534f\u7a0b<\/h2>\n\n\n\n<p>\u4e3a\u4e86\u66f4\u597d\u7684\u4f7f\u7528\u534f\u7a0b\u6765\u5b8c\u6210\u591a\u4efb\u52a1, python\u4e2d\u7684greenlet\u6a21\u5757\u5bf9\u5176\u5c01\u88c5, \u4ece\u800c\u4f7f\u5f97\u4efb\u52a1\u5207\u6362\u66f4\u52a0\u7b80\u5355<\/p>\n\n\n\n<p><strong>\u5b89\u88c5\u6a21\u5757<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install greenlet<\/code><\/pre>\n\n\n\n<p><strong>greenlet\u5b9e\u4f8b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from greenlet import greenlet\nimport time\n\n\ndef test1():\n    while True:\n        print(\"----A----\")\n        gr2.switch()\n        time.sleep(1)\n\n\ndef test2():\n    while True:\n        print(\"----B----\")\n        gr1.switch()\n        time.sleep(1)\n\n\ngr1 = greenlet(test1)\ngr2 = greenlet(test2)\n\n# \u5f00\u59cb\u6267\u884c, \u5207\u6362\u5230\u4efb\u52a11\ngr1.switch()<\/code><\/pre>\n\n\n\n<p>\u6267\u884c\u7ed3\u679c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>----A----\n----B----\n----A----\n----B----\n----A----\n----B----\n----A----\n...<\/code><\/pre>\n\n\n\n<h2>gevent\u5b9e\u73b0\u534f\u7a0b<\/h2>\n\n\n\n<p>gevent\u662f\u6bd4greenlet\u66f4\u7b80\u5355\u7684\u534f\u7a0b\u5b9e\u73b0\u65b9\u5f0f<\/p>\n\n\n\n<p>\u8be5\u6a21\u5757\u540c\u6837\u9700\u8981\u5b89\u88c5, pip install gevent<\/p>\n\n\n\n<p><strong>\u7b80\u5355\u6848\u4f8b<\/strong><\/p>\n\n\n\n<p>gevent\u5b9e\u73b0\u534f\u7a0b\u7684\u6838\u5fc3\u662f, \u5229\u7528sleep\u7684\u65f6\u95f4, \u53bb\u505a\u5176\u4ed6\u4e8b\u60c5, gevent\u4e2d\u53ea\u6709sleep\u624d\u80fd\u5b9e\u73b0\u591a\u4efb\u52a1, \u5fc5\u987b\u4f7f\u7528gevent.sleep()<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import gevent\n\n\ndef f1(n):\n    for i in range(n):\n        print(gevent.getcurrent(), i)\n        gevent.sleep(0.5)     # sleep\u591a\u4e45, \u5c31\u662f\u5ef6\u8fdf\u591a\u4e45, \u53ea\u6709sleep\u624d\u4f1a\u53bb\u505a\u522b\u7684\n\n\ndef f2(n):\n    for i in range(n):\n        print(gevent.getcurrent(), i)\n        gevent.sleep(0.5)\n\n\ndef f3(n):\n    for i in range(n):\n        print(gevent.getcurrent(), i)\n        gevent.sleep(0.5)\n\n\ng1 = gevent.spawn(f1, 5)  # \u6307\u5b9a\u4efb\u52a1, \u53ca\u53c2\u6570\ng2 = gevent.spawn(f2, 5)\ng3 = gevent.spawn(f3, 5)\ng1.join()    # \u5f00\u59cb\u4efb\u52a1\ng2.join()\ng3.join()\n\n<\/code><\/pre>\n\n\n\n<p>\u7a0b\u5e8f\u6267\u884c\u7ed3\u679c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;Greenlet at 0x193ee17f048: f1(5)> 0\n&lt;Greenlet at 0x193ee17f390: f2(5)> 0\n&lt;Greenlet at 0x193ee17f4a8: f3(5)> 0\n&lt;Greenlet at 0x193ee17f048: f1(5)> 1\n&lt;Greenlet at 0x193ee17f390: f2(5)> 1\n&lt;Greenlet at 0x193ee17f4a8: f3(5)> 1\n&lt;Greenlet at 0x193ee17f048: f1(5)> 2\n&lt;Greenlet at 0x193ee17f390: f2(5)> 2\n&lt;Greenlet at 0x193ee17f4a8: f3(5)> 2\n&lt;Greenlet at 0x193ee17f048: f1(5)> 3\n&lt;Greenlet at 0x193ee17f390: f2(5)> 3\n&lt;Greenlet at 0x193ee17f4a8: f3(5)> 3\n&lt;Greenlet at 0x193ee17f048: f1(5)> 4\n&lt;Greenlet at 0x193ee17f390: f2(5)> 4\n&lt;Greenlet at 0x193ee17f4a8: f3(5)> 4\n\nProcess finished with exit code 0\n<\/code><\/pre>\n\n\n\n<p>gevent.joinall() \u53c2\u6570\u662f\u4e00\u4e2a\u5217\u8868, \u53ef\u4ee5\u4e00\u6b21\u52a0\u5165\u591a\u4e2a\u4efb\u52a1<\/p>\n\n\n\n<p>\u5bf9\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f, time.sleep\u6362\u6210gevent.sleep\u5e76\u4e0d\u662f\u4e00\u4e2a\u597d\u7684\u529e\u6cd5, \u800c\u662f\u7ed9\u7a0b\u5e8f&#8221;\u6253\u8865\u4e01&#8221;<\/p>\n\n\n\n<p>\u5728\u6253\u8865\u4e01\u6a21\u5757\u7684\u5934\u90e8, \u5199\u5165\u5982\u4e0b\u4ee3\u7801\u6253\u8865\u4e01<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from gevent import monkey\nmonkey.patch_all()<\/code><\/pre>\n\n\n\n<p>\u5728\u67d0\u4e9b\u4e0b\u8f7d\u5668\u4e2d, \u540c\u65f6\u4e0b\u8f7d\u591a\u4e2a\u4efb\u52a1\u65f6, \u53c8\u4e0d\u8ba9\u670d\u52a1\u5668\u538b\u529b\u8fc7\u5927, \u4e0d\u7ed9\u4f60\u591a\u7ebf\u7a0b\u591a\u8fdb\u7a0b, \u800c\u662f\u534f\u7a0b\u65b9\u5f0f<\/p>\n\n\n\n<p>\u800c\u5728\u670d\u52a1\u5668\u591a\u4efb\u52a1\u4e2d\u4e2d\uff0c\u901a\u5e38\u6bcf\u4e2a\u8fdb\u7a0b\u5c31\u9700\u8981\u51e0mb\u5185\u5b58\uff0c100\u5e76\u53d1\u5219\u81f3\u5c11\u9700\u8981\u51e0\u767emb\u5185\u5b58\uff0c\u82e5\u5408\u7406\u7684\u4f7f\u7528\u534f\u7a0b\u505a\u591a\u7ebf\u7a0b\uff0c\u80fd\u627f\u53d7\u5de8\u5927\u7684\u5e76\u53d1\u91cf\uff0c\u56e0\u4e3a\u5b83\u7684\u6d88\u8017\u6700\u5c11\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u534f\u7a0b, \u4e0d\u662f\u7ebf\u7a0b, \u4e5f\u4e0d\u662f\u8fdb\u7a0b, \u5b83\u4e5f\u80fd\u5b9e\u73b0\u591a\u4efb\u52a1 \u4f46\u4ece\u6280\u672f\u672c\u8eab\u6765\u8bf4, \u5b83\u662f&#8221;\u5355\u8fdb\u7a0b, \u5355\u7ebf\u7a0b&#038;#&hellip; <a href=\"https:\/\/www.52dixiaowo.com\/python\/post-165.html\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">python\u7684\u534f\u7a0b<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18],"tags":[],"_links":{"self":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts\/165"}],"collection":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/comments?post=165"}],"version-history":[{"count":0,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/posts\/165\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/media?parent=165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/categories?post=165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.52dixiaowo.com\/python\/wp-json\/wp\/v2\/tags?post=165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}