gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:34:18 25 4
gpt4 key购买 nike

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

stackless.tasklet(function_being_called)(*args)

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

mylib.tasklet(function_being_called,*args)

它可以工作,但与 Stackless 的语法不同。我不确定在文档中的哪里查找以找出如何完成此操作(因此这个问题的标题相当模糊)。这是否可能,或者这是 Stackless 对解释器更改的一部分?

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

类型错误:“greenlet.greenlet”对象不可调用

使用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.

最佳答案

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

关于python - 如何将参数作为附加参数传递给 python greenlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18219610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com