下面发布的工作代码使用Python threading
和queue
模块来启动单个MyThread
线程,该线程通过全局queue
对象(字典列表)获取传入数据)。每个数据字典用于存储由MyThread
运行的函数。期望data
字典的function
密钥用于传递要运行的函数。并且它的function_argument
键用于传递函数的参数。
我不是使用字典function
和function_argument
键,而是将函数及其参数“包装”到单个变量或对象中以将其传递给MyThread
?所以MyThread
只需要获取函数及其参数,然后只需运行任何解压缩数据字典的工作就可以运行它。
当然,我可以简单地将可执行命令定义为字符串:
cmd = "myFunction(argument = 'Somewhere over the rainbow')"
eval(cmd)
但这似乎是一个丑陋的解决方案。
import logging
formatter = logging.Formatter("[%(levelname)s] %(asctime)s, %(message)s", "%Y-%m-%d %H:%M:%S")
handler = logging.StreamHandler()
handler.setFormatter(formatter)
log = logging.getLogger(__name__)
log.addHandler(handler)
log.setLevel(logging.DEBUG)
from threading import Thread
import Queue as Queue
global queue
queue = Queue.Queue()
class MyThread(Thread):
def __init__(self, parent=None):
Thread.__init__(self, parent)
def run(self):
global queue
while True:
data = queue.get()
function = data.get('function')
argument = data.get('function_argument')
output = function(argument)
queue.task_done()
log.info('MyThread: Task completed. Exiting.')
exit()
threads = []
thread = MyThread()
threads.append(thread)
thread.start()
def myFunction(argument):
log.debug('Running myFunction using argument: %r' % argument)
argument = 'Somewhere over the rainbow'
data = {'function': myFunction, 'function_argument': argument}
queue.put(data)
答案 0 :(得分:1)
只需在队列中添加lambda
(或functools.partial)
函数:
data = lambda : myFunction(argument)
或
import functools
data = functools.partial(myFunction,argument)
然后:
queue.put(data)
然后按原样使用:
data = queue.get()
output = data()