【发布时间】:2022-11-02 02:20:18
【问题描述】:
考虑以下 sn-p:
import concurrent.futures
import time
from random import random
class Test(object):
def __init__(self):
self.my_set = set()
def worker(self, name):
temp_set = set()
temp_set.add(name)
temp_set.add(name*10)
time.sleep(random() * 5)
temp_set.add(name*10 + 1)
self.my_set = self.my_set.union(temp_set) # question 1
return name
def start(self):
result = []
names = [1,2,3,4,5,6,7]
with concurrent.futures.ThreadPoolExecutor(max_workers=len(names)) as executor:
futures = [executor.submit(self.worker, x) for x in names]
for future in concurrent.futures.as_completed(futures):
result.append(future.result()) # question 2
-
self.my_set是否有可能通过标记为“问题 1”的行损坏?我相信union是原子的,但分配不会有问题吗? -
标有“问题 2”的那行有问题吗?我相信列表
append是原子的,所以也许这没问题。我已经阅读了这些文档:
https://docs.python.org/3/library/stdtypes.html#set https://web.archive.org/web/20201101025814id_/http://effbot.org/zone/thread-synchronization.htm Is Python variable assignment atomic? https://docs.python.org/3/glossary.html#term-global-interpreter-lock
并执行了这个问题中提供的 sn-p 代码,但我找不到在这种情况下并发应该如何工作的明确答案。
【问题讨论】:
-
问题 1 不是线程安全的,赋值和联合是 2 个不同的对象,它们之间可能发生线程切换。
标签: python multithreading concurrency thread-safety