如何将参数传递给python greenlet作为附加参数

时间:2013-08-13 21:33:16

标签: python python-stackless greenlets

我正在寻找一种通过另一个函数传递函数参数的方法,其方式与Stackless'tasklet实例化相同:

stackless.tasklet(function_being_called)(*args)

到目前为止,我提出的最佳方式是:

mylib.tasklet(function_being_called,*args)

有效,但与Stackless'语法不同。我不知道在文档中查找如何完成此操作(因此这个问题的标题相当模糊)。这甚至是可能的,还是Stackless对翻译的改变的一部分?

编辑:我现在知道有一种方法可以用于函数,但我不确定它是否适用于我的情况。我正在使用greenlet库:greenlet线程在greenlet被switch()编辑时获取args,而不是实例化。如下所示调用它们会导致

TypeError: 'greenlet.greenlet' object is not callable

使用greenlet.greenlet(function(args))(仍然不正确的语法)立即执行,仍然需要switch()方法中的args。因此,我当前使用上面显示的语法在类中存储变量,以便在调用switch()时传递。希望这不会太多改变这个问题!

根据要求,这是有问题的代码。 首先,关于eri答案的变体(免责声明:我之前从未使用装饰器):

import greenlet # Background "greenlet" threadlet library

_scheduled = [] # Scheduler queue

def newtasklet(func): # Returns a greenlet-making function & switch() arguments. 
    def inner(*args,**kwargs):
        newgreenlet = greenlet.greenlet(func,None)
        return newgreenlet,args,kwargs
    return inner

class tasklet():
    def __init__(self,function=None):
        global _scheduled 
        initializer = newtasklet(function)
        self.greenlet,self.variables,self.kvars = initializer()
        _scheduled.append(self)
        self.blocked = False

tasklet(print)("A simple test using the print function.")

Traceback (most recent call last):
  File "<pyshell#604>", line 1, in <module>
    tasklet(print)("A simple test using the print function.")
TypeError: 'tasklet' object is not callable

原始代码(工作但在语法上不理想):

class tasklet(): 
    def __init__(self,function=None,*variables,parent=None):
        global _scheduled
        self.greenlet = greenlet.greenlet(function,parent)
        self.variables = variables
        _scheduled.append(self)
        self.blocked = False

>>> tasklet(print,"A simple test using the print function.")
<__main__.tasklet object at 0x7f352280e610>
>>> a = _scheduled.pop()
>>> a.greenlet.switch(*a.variables)
A simple test using the print function.

5 个答案:

答案 0 :(得分:1)

我不熟悉Stackless,但是发生的事情是tasklet函数返回对函数的引用,然后由解释器使用* args调用。

一个例子:

def return_the_method(method):
    return method

def add_two(num1, num2):
    return num1 + num2

如果你有这个,然后运行return_the_method(add_two)(1, 2),你将获得3

答案 1 :(得分:1)

stackless.tasklet是装饰者。将您的函数重写为装饰器。

def tasklet(f):
  def inner(*args,**kwargs):
    t= Thread(target=f,args=args,kwargs=kwargs)
    t.start()
    return t
  return inner


task=tasklet(your_func)(arg)
task.join()

它在单独的线程中运行your_func并返回线程实例。

答案 2 :(得分:1)

只需确保从mylib.tasklet返回一个函数:

>>> def call_me(func):
        # do something here, like spawn a thread
        return func

>>> def being_called(str1, str2, str3):
        print str1
        print str2
        print str3

>>> call_me(being_called)('a', 'b', 'c')
a
b
c

答案 3 :(得分:0)

我以前从未使用过stackless,但是stackless.tasklet(function_being_called)正在返回一个给出参数(*args)的函数对象。如果您希望tasklet的语法相同,那么mylib.tasklet应该返回一个函数。

例如:

def inner(*args):
    print '|'.join(args)

def foo(func):
    return func

foo(inner)('hello', 'world')

输出:

hello|world

答案 4 :(得分:0)

import greenlet #Dackground“greenlet”threadlet库

_scheduled = []#Scheduler queue

def newtasklet(func):#返回一个greenlet制作函数&amp; switch()参数。     def inner(* args,** kwargs):         newgreenlet = greenlet.greenlet(func,None)         返回newgreenlet,args,kwargs     返回内心

class tasklet():     def init (self,function = None):         全球_scheduled         initializer = newtasklet(函数)         self.greenlet,self.variables,self.kvars = initializer()         _scheduled.append(个体经营)         self.blocked =错误     def 调用(self,function = None):         返回功能

def imprime(a):     打印

tasklet(imprime)(“使用打印功能的简单测试。”)