首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python请求会话对象是否在线程安全的greenlets之间共享(在绿包之间)?

Python请求会话对象是否在线程安全的greenlets之间共享(在绿包之间)?
EN

Stack Overflow用户
提问于 2014-05-29 14:00:03
回答 1查看 5K关注 0票数 8

请求库会话对象是否可以安全地在gevented程序中跨绿片使用?

编辑-添加更多解释:

当greenlet生成一个套接字调用将请求发送到服务器时,同一个套接字(在共享会话对象中)是否可以被另一个绿包安全地使用来发送自己的请求?

端编辑

我试图用这里发布的代码-- https://gist.github.com/donatello/0b399d0353cb29dc91b0 --来测试这个问题,但是我没有发现任何错误或意外的结果。但是,这并不能验证线程的安全性。

在测试中,我使用一个共享的session对象来发出大量请求,并试图查看该对象是否得到了混合的请求--这有点天真,但我没有遇到任何异常。

为了方便起见,我在这里重新粘贴代码:

client.py

代码语言:javascript
复制
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)
])

server.py

代码语言:javascript
复制
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()

确切的库版本:

requirements.txt

代码语言:javascript
复制
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

还有其他测试可以检查绿线程的安全性吗?在这一点上,请求文档并不太清楚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-29 14:09:02

requests的作者还创建了一个gevent-integration包:grequests。用这个代替。

它支持使用session关键字传递会话:

代码语言:javascript
复制
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)

注意,虽然会话是共享的,并发请求必须每个都使用单独的连接(套接字);HTTP1.x不能在同一连接上复用多个查询。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23935201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档