2013-10-01 5 views
1

그래서 서버를 만들고 요청을합니다. 모두 같은 파일에 있습니다.Gevent - SSL 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)[email protected]$ 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

답변

2

문제는 here입니다.

pyopenssl 및 gevent/greenlet을 사용할 때만 발생합니다. 핸드 셰이크를 다시 시도 할 때 IO가 없으므로 컨트롤은 결코 그린렛 실행 플라스크에 제공되지 않으므로 핸드 셰이크가 성공할 수 없습니다.

shazow/urllib3#250에 대한 bugreport/pullrequest를 열었습니다. 자신을 백 포트하거나 요청의 다음 부 릴리스를 기다리는 것이 간단해야합니다.