Gevent - SSL WSGIServer阻止它不应该

时间:2013-10-01 06:28:06

标签: python python-requests gevent wsgiserver

所以我在同一个文件中创建一个服务器并向它发出请求。

这很正常:

import gevent
import gevent.monkey
gevent.monkey.patch_all()

import requests

from gevent.pywsgi import WSGIServer
from flask import Flask


app = Flask(__name__)
app.debug = True

# Simple catch-all server
@app.route('/', defaults={'path': ''}, methods=['GET', 'POST'])
@app.route('/<path:path>', methods=['GET', 'POST'])
def catch_all(path):
    return 'It is Working!'


if __name__ == '__main__':
    http_server = WSGIServer(('', 8080), app)
    srv_greenlet = gevent.spawn(http_server.start)
    gevent.sleep(0.5)
    resp = requests.get('http://127.0.0.1:8080/')
    print resp.text
    http_server.stop()
    gevent.joinall([srv_greenlet])

输出:

(py2sni)user@host$ python question.py 
127.0.0.1 - - [2013-10-01 11:48:46] "GET / HTTP/1.1" 200 130 0.000614
It is Working!

但这会阻塞,我必须在外部杀死这个过程:

import gevent
import gevent.monkey
gevent.monkey.patch_all()

import requests

from gevent.pywsgi import WSGIServer
from flask import Flask


app = Flask(__name__)
app.debug = True

# Simple catch-all server
@app.route('/', defaults={'path': ''}, methods=['GET', 'POST'])
@app.route('/<path:path>', methods=['GET', 'POST'])
def catch_all(path):
    return 'It is Working!'


if __name__ == '__main__':
    http_server = WSGIServer(('', 4430), app, keyfile='server.key', certfile='server.crt')
    srv_greenlet = gevent.spawn(http_server.start)
    gevent.sleep(0.5)
    resp = requests.get('https://127.0.0.1:4430/')
    print resp.text
    http_server.stop()
    gevent.joinall([srv_greenlet])

这两个脚本的唯一区别是一个使用SSL而另一个不使用SSL。 我在哪里弄错了? 如果它有帮助,我使用gevent 0.13.8并请求2.0

1 个答案:

答案 0 :(得分:2)

问题在于here

仅在使用pyopenssl和gevent / greenlet时才会发生。 因为握手的重试没有IO,所以从不给greenlet运行烧瓶提供控制,因此握手永远不会成功。

我在shazow/urllib3#250开了一个bug报告/ pullrequest。 向后移动或等待下一次轻微的请求发布应该是直截了当的。