gpt4 book ai didi

python - Python 请求 Session 对象是否在 gevent greenlet 之间共享,线程安全(在 greenlet 之间)?

转载 作者:太空狗 更新时间:2023-10-29 21:43:14 24 4
gpt4 key购买 nike

可以requests库 session 对象可以在 gevented 程序中安全地跨 greenlets 使用吗?

编辑 - 添加更多说明:

当一个 greenlet 因调用套接字向服务器发送请求而屈服时,另一个 greenlet 是否可以安全地使用同一个套接字(在共享 session 对象内)发送自己的请求?

结束编辑

我尝试使用此处发布的代码对此进行测试 - https://gist.github.com/donatello/0b399d0353cb29dc91b0 - 但是我没有收到任何错误或意外结果。但是,这并不能验证线程安全。

在测试中,我使用共享 session 对象发出大量请求并尝试查看该对象是否将请求混淆 - 这有点天真,但我没有得到任何异常。

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

客户端.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)
])

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()

确切的库版本:

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

是否有其他测试可以检查 greenlet 线程安全性?请求文档在这一点上并不太清楚。

最佳答案

requests 的作者还创建了一个gevent-集成包:grequests .改用它。

它支持通过session关键字传入 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)

请注意,虽然 session 是共享的,但并发 请求必须各自使用单独的连接(套接字); HTTP 1.x 无法通过同一连接多路复用多个查询。

关于python - Python 请求 Session 对象是否在 gevent greenlet 之间共享,线程安全(在 greenlet 之间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com