2015-08-13 2 views
1

Я пытаюсь использовать модуль gevent.local, чтобы иметь контекст greenlet. Следуя примеру в: http://www.gevent.org/gevent.local.html Я попробовал этот пример кода:Как использовать локальный модуль gevent

#!env python 

import gevent 
from gevent import local 

def foo(): 
    print("IN FOO") 
    data = local.local() 
    data.numbers = 42 

    bar() 

def bar(): 
    print("IN BAR") 
    data = local.local() 
    print(data.numbers) 


def main(): 
    foo_gl = gevent.Greenlet(foo) 
    print("starting foo") 
    foo_gl.start() 
    gevent.joinall([foo_gl]) 

if __name__ == "__main__": 
    main() 

Но я получаю сообщение об ошибке:

$ mytest/local.py 
starting foo 
IN FOO 
IN BAR 
Traceback (most recent call last): 
    File "/Users/omerholzinger/.virtualenvs/sorites/lib/python2.7/site-packages/gevent/greenlet.py", line 327, in run 
    result = self._run(*self.args, **self.kwargs) 
    File "gl_test/local.py", line 11, in foo 
    bar() 
    File "gl_test/local.py", line 16, in bar 
    print(data.numbers) 
    File "/Users/omerholzinger/.virtualenvs/sorites/lib/python2.7/site-packages/gevent/local.py", line 186, in __getattribute__ 
    return object.__getattribute__(self, name) 
AttributeError: 'local' object has no attribute 'numbers' 
<Greenlet at 0x1053b2410: foo> failed with AttributeError 

Что я здесь отсутствует? Благодаря!

ответ

2

Поскольку вы объявляете переменную data в функции foo(), она будет распознана как локальная переменная, которая не может использоваться в другой функции.

И переменная data объявлена ​​в функции bar() является другой локальной переменной, которая не имеет ничего общего с переменной data объявленной в функции foo()

Код

#!env python 

import gevent 
from gevent import local 

def foo(): 
    print("IN FOO") 
    data = local.local() 
    #This line of code declares data as a local variable. 
    data.numbers = 42 

    bar() 

def bar(): 
    print("IN BAR") 
    data = local.local() 
    #This line of code declares data as an another local variable. 
    print(data.numbers) 


def main(): 
    foo_gl = gevent.Greenlet(foo) 
    print("starting foo") 
    foo_gl.start() 
    gevent.joinall([foo_gl]) 

if __name__ == "__main__": 
    main() 

Ниже приводится код, который показывает, как работает модуль gevent.local.

Вы можете узнать, что даже переменная data объявлена ​​как глобальная переменная, она не будет затронута в одной зелене, когда вы изменили одну и ту же переменную в другой озелене. Это означает, что вы можете использовать переменную как локальную переменную в каждой озелене, не объявляя ее снова как локальную переменную.

Надеюсь, это поможет.

Модифицированный код

#!env python 

import gevent 
from gevent import local 

data = local.local() 
data.numbers = 12 
#Declare data as a global variable. 

def foo(): 
    print("IN FOO") 
    data.numbers = 42 
    #Change the value of data.numbers. 

    print(data.__dict__) 
    #Check the values in data in the function foo. 

def bar(): 
    print("IN BAR") 

    print(data.__dict__) 
    #Check the values in data in the function bar. 


def main(): 
    print("In Main") 
    print(data.__dict__) 
    #Check the values in data at beginning. 

    foo_gl = gevent.Greenlet(foo) 
    bar_gl = gevent.Greenlet(bar) 
    foo_gl.start() 
    bar_gl.start() 
    gevent.joinall([foo_gl, bar_gl]) 

    print("Afeter all, In Main") 
    print(data.__dict__) 
    #Check the values in data at the end. 

if __name__ == "__main__": 
    main() 
Смежные вопросы