为什么我在此多线程处理中始终以空白数据结尾

时间:2018-08-29 06:57:08

标签: python-3.x multithreading

我使用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

1 个答案:

答案 0 :(得分:1)

变量在线程之间共享。在这种情况下,如果您要更改原始列表,则可以将列表的副本提交给工作线程:

import

或者您可以向pool.add_task(submitToSite, dictlist[:], "Sector") 分配一个新列表,而不用dictlist就地清除它:

dictlist.clear()