我正在寻找一种通过另一个函数传递函数参数的方法,其方式与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)("使用打印功能的简单测试。")