【发布时间】:2018-08-04 18:48:01
【问题描述】:
我有一个包含数千条记录和一个正则表达式列表的文件。我想依次获取文件中的每条记录,并根据我的正则表达式列表对其进行评估,直到找到匹配项。
我创建了一个单线程脚本,它可以完成这项工作,但速度很慢。为了使其成为多线程,我做了以下调整:
- 创建了
run_target()函数,该函数将传递给 Thread 构造函数 - 创建了 5 个工作线程
- 将目标函数添加到
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