-
Notifications
You must be signed in to change notification settings - Fork 94
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gevent 下的 race condition #69
Comments
相关搜索到的资料: http://ju.outofmemory.cn/entry/104736 https://github.com/LeicsFrameWork/Leics/issues/1 |
http://www.lai18.com/content/1367101.html
|
我用FLASK测一下好像没出现类似的问题 # -*- coding: utf-8 -*-
from flask import Flask, request
from gevent import monkey
import gevent
monkey.patch_all()
app = Flask(__name__)
@app.route('/t1')
def t1():
v = request.values.get("v")
gevent.sleep(5)
v_after_sleep = request.values.get("v")
return 't1: v=%s, v_after_sleep=%s\n'%(v,v_after_sleep)
@app.route('/t2')
def t2():
v = request.values.get("v")
gevent.sleep(1)
v_after_sleep = request.values.get("v")
return 't2: v=%s, v_after_sleep=%s\n'%(v,v_after_sleep)
if __name__ == '__main__':
from gevent.wsgi import WSGIServer
gws = WSGIServer(('127.0.0.1', 5000), app)
gws.serve_forever() |
我其实用的是uwsgi的gevent的模式,倒是没有直接使用uliweb gevent,不过在其它的应用中的确用过纯gevent。有什么好办法吗? |
@zhangclb 是的,你可以看下代码,方式与uliweb类似。 |
@limodou 我用 uwsgi 跑测试过了,一样可以重现这个问题 是不是新的werkzeug这方面已经做了改进了? 你能不能找到 thread local 这块的代码看看? |
https://github.com/limodou/uliweb/blob/master/uliweb/core/SimpleFrame.py#L1395 这里是获得 local request的地方对吧? |
from werkzeug import ClosingIterator, Local On Mon, Jul 25, 2016 at 11:55 AM, zhangclb notifications@github.com wrote:
I like python! |
我现在就想找到不同的thread用不同的env/local是在哪里实现的,还没找到 |
确定Werkzeug新版本没有问题吗?那我可以比较一下。 |
@limodou 你看 https://github.com/limodou/uliweb/blob/master/uliweb/lib/werkzeug/local.py#L19 |
也许和我的使用方式有关吧。这块以前没有关注过,毕竟用gevent的情况并不多。我只是单纯的用了local对象,调用方式要比较看一下。 |
我之前没认真看,原来那篇文章说的意思是werkzeug对于greenlet是没问题的,因为已经针对处理过了,但是对于uwsgi自己的ugreen是有问题的 |
这个问题比较底层,因为我只是直接使用werkzeug的东西,没有特别研究过,看看能不能解决吧。我是用开发服务器发现存在这个问题, uwsgi不知道有没有。 |
@zhangclb @limodou @taogeT 我觉得问题的原因在于创建Request ThreadLocal环境时获取的这把锁 |
@neo1218 看不太懂你的解释,因为我对gevent里的概念并没那么清楚
|
@zhangchunlin 我在2个shell环境中发起curl请求, 一个请求t1, 一个请求t2, 先请求t1: 结果:
由于我是手动控制时间... 我觉得可能是因为等curl正式请求t2的时候已经过了5s了. 对了, 能看一下你的prun程序吗? 我没搜到这个命令... |
@neo1218 prun在这里: https://gist.github.com/zhangchunlin/05576572b628f5bf9d74 |
@neo1218 你应该用 uliweb runserver --gevent ,这样才是用 gevent 方式跑 |
@limodou 找不到 local 在不同线程或者协程中做特别处理的地方 |
我在SimpleFrame.py里改成这样也没用:
关键是虽然有 ident_func 但是不知道在哪里调用到 |
先不用研究了,反正用得很少,有时间再说吧 On Mon, Aug 1, 2016 at 5:01 PM, zhangchunlin notifications@github.com
I like python! |
@limodou 对我来说不少啊,因为我很喜欢用 gevent 来搞异步... |
上面 @neo1218 说是锁的原因,但是我把锁的操作去掉了也是一样的结果,所以应该跟锁没关系吧 |
@zhangchunlin 我这两天再来看看, 我先熟悉熟悉uliweb |
@limodou 经过大量的log我有点快接近原因了,我现在在t1 t2 view函数最前面加上一行
这样问题就没了,把这个import都去掉,问题就又出现了 所以问题应该出在view函数准备好的request等local变量这里,这些local变量并没有用LocalProxy变量,所以不是协程安全的. |
应该找到直接原因了,把 https://github.com/limodou/uliweb/blob/master/uliweb/core/SimpleFrame.py#L1059 这里改成
这个问题就没了 |
…lProxy object should be used to prevent race condition in gevent.
Fix issue #69, when preparing the local env for view, the LocalProxy …
@limodou 这个issue可以关了吧 |
OK |
代码和测试结果在这里: https://gist.github.com/zhangclb/7e173a40ce7dcfef6645c894811593c8 用 uliweb runserver --gevent 跑调试服务器即可重现
The text was updated successfully, but these errors were encountered: