gpt4 book ai didi

python - 多线程无锁将item追加到同一个列表中是否正确?

转载 作者:行者123 更新时间:2023-12-01 07:45:35 25 4
gpt4 key购买 nike

这是详细问题:

我想使用多线程方式进行批量http请求工作,然后将所有这些结果收集到一个列表中并对所有项目进行排序。

所以我想首先在主进程中定义一个空列表origin_list,然后启动一些线程,在将origin_list传递给每个线程后将结果附加到这个列表中。

最后似乎我得到了预期的结果,所以我认为我最终得到了正确的结果列表,没有线程锁,因为列表是一个可变对象,对吗?

我的主要代码如下:

def do_request_work(final_item_list,request_url):
request_results = request.get(request_url).text
# do request work
finnal_item_list.append(request_results )


def do_sort_work(final_item_list):
# do sort work
return final_item_list


def main():

f_item_list = []
request_list = [url1, url2, ...]

with ThreadPoolExecutor(max_workers=20) as executor:
executor.map(
partial(
do_request_work,
f_item_list
),
request_list)

sorted_list = do_sort_work(f_item_list)

非常欢迎任何评论。非常感谢。

最佳答案

我认为,即使不考虑线程安全,这也是一个相当有问题的解决方案。

首先,pythonGIL ,其中

In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once.

因此,我对这里的性能优势表示怀疑,甚至注意到

potentially blocking or long-running operations, such as I/O, image processing, and NumPy number crunching, happen outside the GIL.

所有 python 工作将一次执行一个线程。

从另一个角度来看,同一个锁可能会帮助你解决这里的线程安全问题,因此一次只有一个线程会修改 final_item_list,但我不确定。

无论如何,我会使用多处理 module这里有集成的并行map:

from multiprocessing import Pool

def do_request_work(request_url):
request_results = request.get(request_url).text
# do request work
return request_results

if __name__ == '__main__':
request_list = [url1, url2, ...]

with Pool(20) as p:
f_item_list = p.map(do_request_work, request_list)

这将保证您并行无锁执行请求,因为每个进程只会接收其部分工作,并在准备好时返回结果。

关于python - 多线程无锁将item追加到同一个列表中是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56475484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com