如何打包函数及其参数以保持代码清洁和简单

时间:2017-07-01 16:02:54

标签: python multithreading queue

下面发布的工作代码使用Python threadingqueue模块来启动单个MyThread线程,该线程通过全局queue对象(字典列表)获取传入数据)。每个数据字典用于存储由MyThread运行的函数。期望data字典的function密钥用于传递要运行的函数。并且它的function_argument键用于传递函数的参数。

我不是使用字典functionfunction_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)

1 个答案:

答案 0 :(得分:1)

只需在队列中添加lambda(或functools.partial)函数:

data = lambda : myFunction(argument)

import functools
data = functools.partial(myFunction,argument)

然后:

queue.put(data)

然后按原样使用:

data = queue.get()
output = data()