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



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

stackless.tasklet(function_being_called)(*args)

到目前为止,我想出的最好的方法是:

mylib.tasklet(function_being_called,*args)

它有效,但与Stackless的语法不同。我不知道在文档中的哪里可以找到如何实现这一点(因此这个问题的标题相当模糊)。这可能吗,或者这是Stackless对解释器更改的一部分?

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

TypeError: 'greenlet.greenlet' object is not callable

使用greenlet.greenlet(function(args))(仍然不是正确的语法)会立即执行,并且仍然需要switch()方法中的参数。因此,我目前使用上面显示的语法将变量存储在类中,以便在调用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.

stackless.tasklet是decorator。将函数重写为decorator。

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并返回线程实例。

只需确保从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

我不熟悉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

我以前从未使用过无堆栈,但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

import greenlet#后台"greenlet"线程库

_scheduled=[]#调度程序队列

def newtasklet(func):#返回一个greenlet生成函数&switch()参数。def内部(*args,**kwargs):newgreenlet=greenlet.greenlet(func,无)返回newgreenlet、args、kwargs返回内部

类tasklet():definit(self,function=None):全局调度(_S)initializer=newtasklet(函数)self.greenlet,self.variables,self.kvars=initializer()_scheduled.append(self)self.block=错误def调用(self,function=None):返回函数

定义印记(a):打印

tasklet(implime)("使用打印功能的简单测试。")

最新更新