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