我使用ThreadPoolExector复制/修改了一个类,并使用一个名为add_task的提交函数,从而向池中提交了函数和args,但是有时从池中执行的函数中包含空白数据。我怀疑这是因为我在提交清单后将其清除了,但我不知道如何解决。发送函数调用不会复制变量,对吗?它只是通过参考?因此,如果在提交函数的时间与调用线程之间的时间之间调用dictlist.clear(),则线程不再具有要提交给POST的值了吗?那是比赛条件吗?我该如何解决?我给人的印象是ThreadPoolExecution(还有Queue,因为我也尝试过)确实锁定了自己,但也许我在这里缺少一些重要的东西。
这是调用类函数的代码:
with open(xmfp + "pythoncsvSector.csv", "r", encoding="utf-8", newline='') as sectorcsv:
reader = csv.DictReader(sectorcsv, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) # fieldnames parameter skipped so it knows first row is headers
for row in reader:
dictlist.append(row)
counter += 1
if counter == 100:
pool.add_task(submitToSite, dictlist, "Sector")
dictlist.clear()
counter = 0
这是课程:
class ThreadExecutor:
def __init__(self, max_workers):
self.executor = ThreadPoolExecutor(max_workers=max_workers)
def add_task(self, fn, *args, **kwargs):
try:
future = self.executor.submit(fn, *args, **kwargs)
except Exception as e:
print(e)
else:
return future
我正在调用的函数执行POST请求,并将响应文本和状态代码写入文件。
下面是完整的代码:https://pastebin.com/Qu6cYSnE
答案 0 :(得分:1)
变量在线程之间共享。在这种情况下,如果您要更改原始列表,则可以将列表的副本提交给工作线程:
import
或者您可以向pool.add_task(submitToSite, dictlist[:], "Sector")
分配一个新列表,而不用dictlist
就地清除它:
dictlist.clear()