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

Python 将目标函数参数传递给线程构造函数,python,multithreading,Python,Multithreading,我有一个包含数千条记录和正则表达式列表的文件。我希望依次获取文件中的每条记录,并根据正则表达式列表对其求值,直到找到匹配项为止 我创建了一个单线程脚本,它可以完成任务,但速度非常慢。为了实现多线程,我做了以下调整: 创建了传递给线程构造函数的run\u target()函数 创建了5个工作线程 将目标函数添加到检查文件()函数中 问题:run\u target()在check\u file()函数中执行循环时,每次迭代时都会向其传递两个参数。我是否需要在创建工作线程时以某种方式将参数传递给构造函

我有一个包含数千条记录和正则表达式列表的文件。我希望依次获取文件中的每条记录,并根据正则表达式列表对其求值,直到找到匹配项为止

我创建了一个单线程脚本,它可以完成任务,但速度非常慢。为了实现多线程,我做了以下调整:

  • 创建了传递给线程构造函数的
    run\u target()
    函数
  • 创建了5个工作线程
  • 将目标函数添加到
    检查文件()
    函数中
  • 问题:
    run\u target()
    check\u file()
    函数中执行
    循环时,每次迭代
    时都会向其传递两个参数。我是否需要在创建工作线程时以某种方式将参数传递给构造函数,还是将其保留为默认值?或者,我应该用默认值传递关键字参数吗

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

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

    这是您的第一个问题-是的,因为函数参数需要在
    线程中传递。因此,您需要的不是
    worker=Thread(target=run\u target(),args=())
    而是
    worker=Thread(target=run\u target,args=(key,expr))
    。注意
    run\u target
    后面没有大括号

    无论如何,您发布的代码似乎并不符合您的意图。在我看来,为了实现您的目标,更好的策略是使用一个以正则表达式为参数的函数,并在该函数中完成文件的整个处理。然后用
    线程生成几个线程(target=process\u file,args=(expr,)
    (注意
    expr
    后面的逗号)

    请注意,在最流行的python发行版中,线程存在一个已知的障碍,这使得它们在多核CPU上毫无用处-请参阅中的详细信息。如果在您的系统上是这样,那么使用是一个很好的选择——高级API非常类似


    快乐编码:)

    我根本不懂这段代码。您的循环将创建尝试运行
    run\u target
    的线程,但它们都将失败,因为您正在传递一个空的参数元组。然后
    check_file
    调用
    run_target
    本身,与线程完全分离。您想创建线程池还是什么(例如,
    并发.futures.ThreadPoolExecutor
    )?在任何情况下,我都不希望使用线程进行正则表达式匹配会得到任何加速,因为这项工作是CPU受限的,GIL将阻止任何真正的并发。谢谢Evgeney。回答得很好。这就是我要找的。