将目标函数参数传递给线程构造函数

时间:2018-08-04 18:48:01

标签: python multithreading

我有一个包含数千条记录和一个正则表达式列表的文件。我想依次获取文件中的每条记录,并根据我的正则表达式列表对其进行评估,直到找到匹配的地方。

我创建了一个单线程脚本,它可以完成工作,但是速度很慢。为了使其成为多线程,我进行了以下调整:

  1. 创建了run_target()函数,该函数将传递给Thread构造函数
  2. 创建了5个工作线程
  3. 将目标函数添加到check_file()函数中。

问题:run_target()while函数的check_file()循环的每次迭代中都接受2个参数,这些参数我都传递给它。创建工作线程时,是否需要以某种方式将参数传递给构造函数,还是应将其保留为默认值?或者,我应该使用默认值传递关键字参数吗?

此外,有没有更好或更聪明的方法来解决此问题。提前致谢。

def run_target(key, expr):
    matchStr = re.search(expr, key, re.I)
    if matchStr:
        return 1
    else:
        return 0


for i in range(number_of_threads):
    worker = Thread(target = run_target(), args = ())
    worker.daemon = True
    t.start()


def check_file():

    for key, value in data.items():
        while True:
            expr = q.get()
            result = run_target(key, expr)
            if result == 1:
                lock.acquire()
                print ‘Match found’
                lock.release()
                break
            q.task_done()
        q.join()

1 个答案:

答案 0 :(得分:1)

第一个问题-是的,根据the threading library documentation,函数参数需要在Thread构造函数中传递。因此,您需要像worker = Thread(target = run_target(), args = ())这样的东西来代替worker = Thread(target = run_target, args = (key, expr))。请注意run_target之后没有大括号。

无论如何,您发布的代码似乎并没有达到您的预期。 IMO,为了实现您的目标,更好的策略是拥有一个将正则表达式作为参数的函数,并在该函数中对文件进行整个处理。然后使用Thread(target = process_file, args = (expr,))生成多个线程(请注意expr之后的逗号)。

请注意,最流行的python发行版中存在一个已知的线程障碍,这使它们在多核CPU上无用-请参见this SO answer。如果您的系统上是这种情况,那么使用multiprocessing是一个不错的选择-高级API非常相似。

快乐编码:)