gpt4 book ai didi

python - Uwsgi 与 gevent 对比线程

转载 作者:太空狗 更新时间:2023-10-29 22:30:10 28 4
gpt4 key购买 nike

首先,抱歉我的英语不好。在我的项目中,我有很多 I/O 网络请求。主要数据存储在另一个项目中,并通过 web API (JSON/XML)、轮询提供访问。我们将此 API 用于每个新用户 session (获取有关用户的信息)。有时,我们在等待回复时遇到问题。我们使用nginx+uwsgi+django。如您所知,Django 是同步的(或阻塞的)。我们使用多线程的 uwsgi 来解决网络 IO 等待的问题。我决定阅读有关 gevent 的内容。我了解合作式和抢先式多任务处理之间的区别。对于这个问题(网络 I/O 瓶颈),我希望 gevent 是比 uwsgi 线程更好的解决方案。但结果几乎相同。有时 gevent 较弱。也许在某个地方我错了。请告诉我。

这是 uwsgi 配置示例。盖文特:

$ uwsgi --http :8001 --module ugtest.wsgi --gevent 40 --gevent-monkey-patch

线程:

$ uwsgi --http :8001 --module ugtest.wsgi --enable-threads --threads 40

Controller 示例:

def simple_test_action(request):
# get data from API without parsing (only for simple I/O test)
data = _get_data_by_url(API_URL)
return JsonResponse(data, safe=False)

import httplib
from urlparse import urlparse
def _get_data_by_url(url):
u = urlparse(url)
if str(u.scheme).strip().lower() == 'https':
conn = httplib.HTTPSConnection(u.netloc)
else:
conn = httplib.HTTPConnection(u.netloc)
path_with_params = '%s?%s' % (u.path, u.query, )
conn.request("GET", path_with_params)
resp = conn.getresponse()
print resp.status, resp.reason
body = resp.read()
return body

测试(使用 geventhttpclient ):

def get_info(i):
url = URL('http://localhost:8001/simpletestaction/')
http = HTTPClient.from_url(url, concurrency=100, connection_timeout=60, network_timeout=60)
try:
response = http.get(url.request_uri)
s = response.status_code
body = response.read()
finally:
http.close()


dt_start = dt.now()
print 'Start: %s' % dt_start

threads = [gevent.spawn(get_info, i) for i in xrange(401)]
gevent.joinall(threads)
dt_end = dt.now()

print 'End: %s' % dt_end
print dt_end-dt_start

在这两种情况下,我都有相似的时间。 gevent/greenlets 和协作多任务处理在类似问题(API 代理)中的优势是什么?

最佳答案

40的并发量可不是让gevent大放异彩的水平。 Gevent 是关于并发性而不是并行性(或每个请求的性能),因此具有如此“低”水平的并发性并不是获得改进的好方法。

一般你会看到 gevent 并发级别是几千,而不是 40 :)

对于阻塞 I/O python 线程还不错(在 I/O 期间释放 GIL),gevent 的优势在于资源使用(拥有 1000 个 python 线程会大材小用)并且无需考虑锁定和 friend 。

显然,请记住,您的整个应用程序必须对 gevent 友好才能获得优势,而 django(默认情况下)需要进行一些调整(例如,数据库适配器必须更改为对 gevent 友好的内容)。

关于python - Uwsgi 与 gevent 对比线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27890327/

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