【发布时间】:2026-01-08 10:05:02
【问题描述】:
我有这个任务同时受 I/O 限制和 CPU 限制。
基本上,我从用户那里获取查询列表,谷歌搜索它们(通过 custom-search-api),将每个查询结果存储在 .txt 文件中,并将所有结果存储在 results.txt 文件中。
我在想也许并行性在这里可能是一个优势。 我的整个任务都用一个包含 2 个成员字段的对象包装,我应该在所有线程/进程(一个列表和一个字典)中使用它们。
因此,当我使用多处理时,我会得到奇怪的结果(我认为这是因为我的共享资源)。
即:
class MyObject(object):
_my_list = []
_my_dict = {}
_my_dict 包含 key:value 对 "query_name":list()。
_my_list 是要在 google 中搜索的查询列表。假设它没有被写入是安全的。
对于每个查询:我在 google 上搜索它,获取顶部结果并将其存储在 _my_dict
我想并行执行此操作。我认为线程可能很好,但似乎它们会减慢工作速度..
我是如何尝试的(这是每个查询完成整个工作的方法):
def _do_job(self, query):
""" search the query on google (via http)
save results on a .txt file locally. """
这是应该为所有查询并行执行所有作业的方法:
def find_articles(self):
p = Pool(processes=len(self._my_list))
p.map_async(self._do_job, self._my_list)
p.close()
p.join()
self._create_final_log()
上述执行不起作用,我得到损坏的结果...
但是,当我使用多线程时,结果很好,但速度很慢:
def find_articles(self):
thread_pool = []
for vendor in self._vendors_list:
self._search_validate_cache(vendor)
thread = threading.Thread(target=self._search_validate_cache, args=. (vendor,))
thread_pool.append(thread)
thread.start()
for thread in thread_pool:
thread.join()
self._create_final_log()
任何帮助将不胜感激,谢谢!
【问题讨论】:
-
如果您的任务受 CPU 限制(或者在 IO 任务期间可能不释放 GIL),线程无法帮助您,因为每个进程一次只允许运行一个线程(因为python的内存管理不是线程安全的)。
multiprocessing通常是解决这个问题的方法,但与线程不同;进程不共享内存空间。您需要特殊的共享数据结构来在进程之间共享数据。普通列表和字典不起作用。 -
我提供的答案是否有运气测试?
标签: python multithreading multiprocessing