﻿{"id":514,"date":"2011-06-29T14:06:45","date_gmt":"2011-06-29T06:06:45","guid":{"rendered":"http:\/\/nick.workao.org\/?p=514"},"modified":"2011-06-29T14:06:45","modified_gmt":"2011-06-29T06:06:45","slug":"%e5%88%9d%e8%af%95gevent-%e2%80%93-%e9%ab%98%e6%80%a7%e8%83%bd%e7%9a%84python%e5%b9%b6%e5%8f%91%e6%a1%86%e6%9e%b6","status":"publish","type":"post","link":"https:\/\/nick.txtcc.com\/index.php\/python\/514","title":{"rendered":"\u521d\u8bd5Gevent \u2013 \u9ad8\u6027\u80fd\u7684Python\u5e76\u53d1\u6846\u67b6"},"content":{"rendered":"<p>Gevent\u662f\u4e00\u4e2a\u57fa\u4e8egreenlet\u7684Python\u7684\u5e76\u53d1\u6846\u67b6\uff0c\u4ee5\u5fae\u7ebf\u7a0bgreenlet\u4e3a\u6838\u5fc3\uff0c\u4f7f\u7528\u4e86epoll\u4e8b\u4ef6\u76d1\u542c\u673a\u5236\u4ee5\u53ca\u8bf8\u591a\u5176\u4ed6\u4f18\u5316\u800c\u53d8\u5f97\u9ad8\u6548\u3002<\/p>\n<p>\u4e8egreenlet\u3001eventlet\u76f8\u6bd4\uff0c\u6027\u80fd\u7565\u4f4e\uff0c\u4f46\u662f\u5b83\u5c01\u88c5\u7684API\u975e\u5e38\u5b8c\u5584\uff0c\u6700\u8d5e\u7684\u662f\u63d0\u4f9b\u4e86\u4e00\u4e2amonkey\u7c7b\uff0c\u53ef\u4ee5\u5c06\u73b0\u6709\u57fa\u4e8ePython\u7ebf\u7a0b\u76f4\u63a5\u8f6c\u5316\u4e3agreenlet\uff0c\u76f8\u5f53\u4e8eproxy\u4e86\u4e00\u4e0b\uff08\u6253\u4e86patch\uff09\u3002<\/p>\n<p>\u4eca\u5929\u6709\u7a7a\u5c31\u8feb\u4e0d\u53ca\u5f85\u7684\u8bd5\u4e00\u4e0b\u6548\u679c\u3002<\/p>\n<p>1\u3001\u5b89\u88c5<\/p>\n<p>Gevent\u4f9d\u8d56libevent\u548cgreenlet\uff0c\u9700\u8981\u5206\u522b\u5b89\u88c5\u3002<\/p>\n<p>?\n#\u76f8\u5173\u4ee3\u7801, [\u56db\u53f7\u7a0b\u5e8f\u5458] <a href=\"http:\/\/www.coder4.com\">http:\/\/www.coder4.com<\/a>\n#libevent 1.4.x\nsudo apt-get install libevent-dev<\/p>\n<p>#python_dev\nsudo apt-get install python-dev<\/p>\n<p>#easy_install\nwget -q <a href=\"http:\/\/peak.telecommunity.com\/dist\/ez_setup.py\">http:\/\/peak.telecommunity.com\/dist\/ez_setup.py<\/a>\nsudo python .\/ez_setup.py<\/p>\n<p>#greenlet\nwget <a href=\"http:\/\/pypi.python.org\/packages\/source\/g\/greenlet\/greenlet-0.3.1.tar.gz#md5=8d75d7f3f659e915e286e1b0fa0e1c4d\">http:\/\/pypi.python.org\/packages\/source\/g\/greenlet\/greenlet-0.3.1.tar.gz#md5=8d75d7f3f659e915e286e1b0fa0e1c4d<\/a>\ntar -xzvf greenlet-0.3.1.tar.gz\ncd greenlet-0.3.1\/\nsudo python setup.py install<\/p>\n<p>#gevent\nwget <a href=\"http:\/\/pypi.python.org\/packages\/source\/g\/gevent\/gevent-0.13.6.tar.gz#md5=7c836ce2315d44ba0af6134efbcd38c9\">http:\/\/pypi.python.org\/packages\/source\/g\/gevent\/gevent-0.13.6.tar.gz#md5=7c836ce2315d44ba0af6134efbcd38c9<\/a>\ntar -xzvf gevent-0.13.6.tar.gz\ncd gevent-0.13.6\/\nsudo python setup.py install<\/p>\n<p>\u81f3\u6b64\uff0c\u5b89\u88c5\u5b8c\u6bd5\u3002<\/p>\n<p>2\u3001\u6d4b\u8bd5\u4ee3\u7801\uff1aXML-RPC<\/p>\n<p>\u8fd9\u91cc\u5fc5\u987b\u4f7f\u7528\u652f\u6301\u7ebf\u7a0b\u7684XML-RPC\uff0c\u5426\u5219\u65e0\u6cd5\u53d1\u6325gevent\u7684\u4f18\u52bf\uff01<\/p>\n<p>\u4f20\u7edf\u7248\u672c\uff1a\n\u9700\u8981\u8bf4\u660e\u7684\u662f\uff0c\u8fd9\u4e2a\u5e76\u5f88\u591a\u8d44\u6599\u63cf\u8ff0\u7684\u975e\u5355\u7ebf\u7a0b\uff0c\u800c\u662f\u4e00\u4e2aselect\u7248\u672c\uff0c\u6240\u4ee5\u67d0\u4e9b\u65f6\u5019\u6bd4\u7ebf\u7a0b\u7248\u672c\u6027\u80fd\u597d\u3002<\/p>\n<p>?\n#\u76f8\u5173\u4ee3\u7801, [\u56db\u53f7\u7a0b\u5e8f\u5458] <a href=\"http:\/\/www.coder4.com\">http:\/\/www.coder4.com<\/a>\nfrom SocketServer import ThreadingMixIn\nfrom SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler<\/p>\n<p>from SocketServer import TCPServer<\/p>\n<p>TCPServer.request_queue_size = 10000<\/p>\n<p>#Logic function\ndef add(a, b):\nreturn a + b<\/p>\n<p>#Logic function 2\ndef gen(n):\nreturn &#8216;0&#8217; * n<\/p>\n<p>#create server\nserver = SimpleXMLRPCServer((&#8221;, 8080), SimpleXMLRPCRequestHandler,False)\nserver.register_function(add, &#8220;add&#8221;)\nserver.register_function(gen, &#8220;gen&#8221;)\nserver.serve_forever()<\/p>\n<p>\u7ebf\u7a0b\u7248\u672c\uff1a<\/p>\n<p>?\n#\u76f8\u5173\u4ee3\u7801, [\u56db\u53f7\u7a0b\u5e8f\u5458] <a href=\"http:\/\/www.coder4.com\">http:\/\/www.coder4.com<\/a>\nfrom SocketServer import ThreadingMixIn\nfrom SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler<\/p>\n<p>#Threaded XML-RPC\nclass TXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass<\/p>\n<p>#Logic function\ndef add(a, b):\nreturn a + b<\/p>\n<p>#Logic function 2\ndef gen(n):\nreturn &#8220;0&#8221; * n<\/p>\n<p>#create server\nserver = TXMLRPCServer((&#8221;, 8080), SimpleXMLRPCRequestHandler)\nserver.register_function(add, &#8220;add&#8221;)\nserver.register_function(gen, &#8220;gen&#8221;)\nserver.serve_forever()<\/p>\n<p>3\u3001\u6d4b\u8bd5\u5ba2\u6237\u7aef<\/p>\n<p>?\n#\u76f8\u5173\u4ee3\u7801, [\u56db\u53f7\u7a0b\u5e8f\u5458] <a href=\"http:\/\/www.coder4.com\">http:\/\/www.coder4.com<\/a>\nfrom xmlrpclib import ServerProxy<\/p>\n<p>#Execute RPC\nserver = ServerProxy(&#8220;<a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a>&#8220;)\n#print server.add(3,5)\nprint server.gen(2048)<\/p>\n<p>4\u3001gevent\u7684monkey\u5305\u88c5\u540e\u7684XML-RPC<\/p>\n<p>monkey\u662f\u975e\u5165\u4fb5\u5f0f\u7684patch\uff0c\u53ea\u9700\u8981\u663e\u793a\u8c03\u7528\u4f60\u9700\u8981patch\u7684\u4e1c\u897f\u5c31\u884c\u4e86\uff0c\u522b\u770b\u6211\u7528\u4e86\u4e09\u884c\uff0c\u5176\u5b9e\u53ef\u4ee5patch_all()\u7684<\/p>\n<p>?\n#\u76f8\u5173\u4ee3\u7801, [\u56db\u53f7\u7a0b\u5e8f\u5458] <a href=\"http:\/\/www.coder4.com\">http:\/\/www.coder4.com<\/a>\nfrom SocketServer import ThreadingMixIn\nfrom SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler\nfrom gevent import monkey<\/p>\n<p>#Threaded XML-RPC &#038;&#038; Monkey Patch\nmonkey.patch_socket() #Just 2 line!\nmonkey.patch_thread() #Just 3 line!\nmonkey.patch_select() #Just 3 line!\nclass TXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass<\/p>\n<p>#Logic function\ndef add(a, b):\nreturn a + b<\/p>\n<p>#Logic function 2\ndef gen(n):\nreturn &#8220;0&#8221; * n<\/p>\n<p>#create server\nserver = TXMLRPCServer((&#8221;, 8080), SimpleXMLRPCRequestHandler)\nserver.register_function(add, &#8220;add&#8221;)\nserver.register_function(gen, &#8220;gen&#8221;)\nserver.serve_forever()<\/p>\n<p>5\u3001\u6d4b\u8bd5\u7ed3\u679c<\/p>\n<p>\u73b0\u5728\u53ea\u6709\u4e00\u53f0\u673a\u5668\uff0c\u4e0b\u5348\u53bb\u5b9e\u9a8c\u5ba4\u4e24\u53f0\u673a\u5668\u8dd1\u4e86\u4ee5\u540e\uff0c\u653e\u4e0a\u7ed3\u679c\u3002\u5bf9gevent\u8fd8\u662f\u6bd4\u8f83\u5bc4\u5e0c\u671b\u7684\uff0c\u5e0c\u671b\u4e0d\u8981\u592a\u5dee\u3002\u3002<\/p>\n<p>\u5ba2\u6237\u7aef\u7684\u7279\u6b8a\u914d\u7f6e\uff1a\necho -e \u20191024\\t65535\u2032 | sudo tee \/proc\/sys\/net\/ipv4\/ip_local_port_range\necho 1 | sudo tee \/proc\/sys\/net\/ipv4\/tcp_tw_recycle\necho 1 | sudo tee \/proc\/sys\/net\/ipv4\/tcp_syncookies\nulimit -n 10240<\/p>\n<p>\u670d\u52a1\u5668\u7aef\u7684\u7279\u6b8a\u914d\u7f6e\uff1a\necho \u201c10152 65535\u2033 > \/proc\/sys\/net\/ipv4\/ip_local_port_range\necho 1 | sudo tee \/proc\/sys\/net\/ipv4\/tcp_tw_recycle\nsysctl -w fs.file-max=128000\nsysctl -w net.ipv4.tcp_keepalive_time=300\nsysctl -w net.core.somaxconn=250000\nsysctl -w net.ipv4.tcp_max_syn_backlog=2500\nsysctl -w net.core.netdev_max_backlog=2500\nulimit -n 10240<\/p>\n<p>\u7136\u540e\u8bf4\u8ba9\u5927\u5bb6\u6bd4\u8f83\u5931\u671b\u7684\u7ed3\u679c\uff1a\u6d4b\u8bd5\u6548\u679c\u975e\u5e38\u5931\u8d25\uff0c\u7ecf\u5e38\u51fa\u73b0\u5f02\u5e38\u60c5\u51b5\uff0c\u6839\u636e\u6211\u7684\u5206\u6790\u662f\u9ed8\u8ba4\u7684XML-RPC\u6ca1\u6709backlog(\u6216\u8005\u9ed8\u8ba4\u592a\u4f4e)\uff0c\u5bfc\u81f4\u538b\u529b\u4e00\u5927\uff0c\u5c31\u4f1afail accept\uff0c\u4ece\u800c\u5bfc\u81f4RESET\uff08connection refused\uff09\u3002\n\u6240\u4ee5\u8bf4\u5bf9monkey\u7684patch\u4e0d\u8981\u62b1\u592a\u5927\u5e0c\u671b\uff0c\u4ed6\u662f\u548c\u539f\u4ee3\u7801\u5bc6\u5207\u76f8\u5173\u7684\u3002<\/p>\n<p>\u8865\u5145\uff1a\u5df2\u7ecf\u627e\u5230\u4fee\u6539\u9ed8\u8ba4backlog\u7684\u65b9\u6cd5\uff0c\u5982\u4e0b\uff1a<\/p>\n<p>?\n#\u76f8\u5173\u4ee3\u7801, [\u56db\u53f7\u7a0b\u5e8f\u5458] <a href=\"http:\/\/www.coder4.com\">http:\/\/www.coder4.com<\/a>\nfrom SocketServer import TCPServer\n#\u4fee\u6539\u8fd9\u4e2a\u5168\u5c40\u53d8\u91cf\u5373\u53ef\nTCPServer.request_queue_size = 5000<\/p>\n<p>\u5f53\u7136\u6d4b\u8bd5\u6570\u636e\u8bf4\u660e\uff0c\u4e0d\u8981\u8fc7\u5206\u8ff7\u604bmonkey\uff0c\u90a3\u53ea\u662f\u4e2a\u4f20\u8bf4~<\/p>\n<p>\u6d4b\u8bd5\u6570\u636e\uff1a\nc=500 n=50000\n\u9ed8\u8ba4\uff1a2845\/s, 8M\n\u591a\u7ebf\u7a0b\uff1a1966\/s, 51M\ngevent\uff1a1888\/s, 11M<\/p>\n<p>c=1000 n=100000\n\u9ed8\u8ba4\uff1a3096\/s, 8M\n\u591a\u7ebf\u7a0b\uff1a1895\/s, 52M\ngevent\uff1a1936\/s, 11M<\/p>\n<p>c=5000 n=500000\n\u9ed8\u8ba4\uff1a3009\/s, 8M\n\u591a\u7ebf\u7a0b\uff1a\u5931\u8d25\uff0c\u65e0\u6cd5\u521b\u5efa\u65b0\u7ebf\u7a0b\ngevent\uff1a1988\/s, 11M<\/p>\n<p>c=10000 n=1000000\n\u9ed8\u8ba4\uff1a2883\/s, 8M\n\u591a\u7ebf\u7a0b\uff1a\u5931\u8d25\uff0c\u65e0\u6cd5\u521b\u5efa\u65b0\u7ebf\u7a0b\ngevent\uff1a1992\/s, 20M<\/p>\n<p>monkey\u7684\u4f18\u70b9\u5c31\u662f\uff1a\u7701\u5185\u5b58\uff0c\u6211\u662f\u548c\u7ebf\u7a0b\u7684\u76f8\u6bd4\u3002\n\u6211\u4ed4\u7ec6\u7684\u5206\u6790\u4e86\u4e00\u4e0b\uff0cXML-RPC\u4f7f\u7528CPU\u7684\u6bd4\u4f8b\u8fd8\u662f\u5f88\u5927\u7684\uff0c\u76f8\u6bd4\u8f83\u4e8e\u76f4\u63a5http\u7684\u8ba1\u7b97\uff0cxmlrpc\u8fd8\u662f\u5c5e\u4e8ecpu\u5bc6\u96c6\u578b\u3002\n\u5728\u8fd9\u79cdCPU\u5360\u7528\u5f88\u9ad8\uff0c\u9700\u8981\u53cd\u590d\u4e89\u593a\u5faegreenlet\u7684\u60c5\u51b5\u4e0b\uff0cgevent\u5e76\u4e0d\u5177\u6709\u4f18\u52bf\u3002\n\u6216\u8005\u4ece\u53e6\u4e00\u79cd\u89d2\u5ea6\u8bf4\uff0c\u6d4b\u8bd5\u673a\u4e0d\u591f\u5f3a\u5927\uff0c\u5582\u4e0d\u9971gevent\uff08\u53ef\u4ee5\u770b\u5230\uff0c\u968f\u7740\u5e76\u53d1\u7ebf\u7a0b\u5347\u9ad8\uff0cgevent\u7684\u6027\u80fd\u4e0d\u964d\u53cd\u5347\uff0c\u800c\u9ed8\u8ba4\u7684\u5219\u5728\u4e0d\u65ad\u4e0b\u964d\uff09<\/p>","protected":false},"excerpt":{"rendered":"<p>Gevent\u662f\u4e00\u4e2a\u57fa\u4e8egreenlet\u7684Python\u7684\u5e76\u53d1\u6846\u67b6\uff0c\u4ee5\u5fae\u7ebf\u7a0bgreenlet\u4e3a\u6838\u5fc3\uff0c\u4f7f\u7528\u4e86epoll\u4e8b\u4ef6\u76d1\u542c\u673a\u5236\u4ee5\u53ca\u8bf8\u591a\u5176\u4ed6\u4f18\u5316\u800c\u53d8\u5f97\u9ad8\u6548\u3002 \u4e8egreenlet\u3001eventlet\u76f8\u6bd4\uff0c\u6027\u80fd&#46;&#46;&#46;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[274],"tags":[270,275],"class_list":["post-514","post","type-post","status-publish","format-standard","hentry","category-python","tag-gevent","tag-python-2"],"_links":{"self":[{"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts\/514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/comments?post=514"}],"version-history":[{"count":1,"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts\/514\/revisions"}],"predecessor-version":[{"id":515,"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/posts\/514\/revisions\/515"}],"wp:attachment":[{"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/media?parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/categories?post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nick.txtcc.com\/index.php\/wp-json\/wp\/v2\/tags?post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}