我有一个包含数千条记录和一个正则表达式列表的文件。我想依次获取文件中的每条记录,并根据我的正则表达式列表对其进行评估,直到找到匹配的地方。
我创建了一个单线程脚本,它可以完成工作,但是速度很慢。为了使其成为多线程,我进行了以下调整:
run_target()
函数,该函数将传递给Thread构造函数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()
答案 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非常相似。
快乐编码:)