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