【问题标题】:Passing target function arguments to Thread constructor将目标函数参数传递给 Thread 构造函数
【发布时间】:2018-08-04 18:48:01
【问题描述】:

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

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

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

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

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

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()

【问题讨论】:

  • 我完全看不懂这段代码。您的循环将创建尝试运行run_target 的线程,但它们都会失败,因为您传递了一个空的参数元组。然后check_file 调用run_target 本身,与线程完全分离。你想创建一个线程池或其他东西(例如concurrent.futures.ThreadPoolExecutor)吗?无论如何,我不希望您使用线程进行正则表达式匹配会获得任何加速,因为这项工作受 CPU 限制,而 GIL 将阻止任何真正的并发。

标签: python multithreading


【解决方案1】:

关于您的第一个问题 - 是的,根据 the threading library documentation,函数参数需要在 Thread 构造函数中传递。因此,您需要worker = Thread(target = run_target, args = (key, expr)) 之类的东西,而不是worker = Thread(target = run_target(), args = ())。注意run_target 后面没有大括号。

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

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

编码愉快:)

【讨论】:

  • 谢谢 Evgeney。优秀的答案。这就是我一直在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多