don*_*llo 7 python thread-safety gevent python-2.7 python-requests
可以在gevented程序中安全地跨greenlet使用请求库会话对象吗?
编辑 - 添加更多解释:
当greenlet因为已经发出套接字调用将请求发送到服务器而产生时,另一个greenlet是否可以安全地使用同一个套接字(在共享会话对象内)发送自己的请求?
结束编辑
我试图用这里发布的代码测试这个 - https://gist.github.com/donatello/0b399d0353cb29dc91b0 - 但我没有错误或意外的结果.但是,这不会验证线程安全性.
在测试中,我使用共享会话对象来发出大量请求,并尝试查看对象是否混淆了请求 - 这有点天真,但我没有任何例外.
为方便起见,我在这里重新粘贴代码:
client.py
import gevent
from gevent.monkey import patch_all
patch_all()
import requests
import json
s = requests.Session()
def make_request(s, d):
r = s.post("http://127.0.0.1:5000", data=json.dumps({'value': d}))
if r.content.strip() != str(d*2):
print("Sent %s got %s" % (r.content, str(d*2)))
if r.status_code != 200:
print(r.status_code)
print(r.content)
gevent.joinall([
gevent.spawn(make_request, s, v)
for v in range(300)
])
Run Code Online (Sandbox Code Playgroud)
server.py
from gevent.wsgi import WSGIServer
from gevent.monkey import patch_all
patch_all()
from flask import Flask
from flask import request
import time
import json
app = Flask(__name__)
@app.route('/', methods=['POST', 'GET'])
def hello_world():
d = json.loads(request.data)
return str(d['value']*2)
if __name__ == '__main__':
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
精确的库版本:
requirements.txt
Flask==0.10.1
Jinja2==2.7.2
MarkupSafe==0.23
Werkzeug==0.9.4
argparse==1.2.1
gevent==1.0.1
greenlet==0.4.2
gunicorn==18.0
itsdangerous==0.24
requests==2.3.0
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)
是否有其他测试可以检查greenlet线程的安全性?请求文档在这一点上不太清楚.
作者requests还创建了一个gevent-integration包:grequests.改用它.
它支持使用session关键字传递会话:
import grequests
s = requests.Session()
requests = [grequests.post("http://127.0.0.1:5000",
data=json.dumps({'value': d}), session=s)
for d in range(300)]
responses = grequests.map(requests)
for r in responses:
if r.content.strip() != str(d*2):
print("Sent %s got %s" % (r.content, str(d*2)))
if r.status_code != 200:
print(r.status_code)
print(r.content)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3443 次 |
| 最近记录: |