繁体   English   中英

Python 线程类型错误太多 arguments

[英]Python threading TypeError too many arguments

我有以下代码试图重新创建 Reader Writer 问题(注意我还没有使用锁):

import threading

class ReadWrite:
    threadList = [0] * 20

    def __init__(self, origData):
        self.readerLock = threading.Lock()
        self.writerLock = threading.Lock()
        self.data = origData
        self.readerCount = 0

    def acquireReadLock(self):
        self.readerLock.acquire()

    def releaseReadLock(self):
        self.readerLock.release()

    def acquireWriteLock(self):
        self.writerLock.acquire()

    def releaseWriteLock(self):
        self.writerLock.release()

    def printData(self, threadName):
        print(threadName, ' printed ', self.data)

    def modifyData(self, threadName, newData):
        print(threadName, ' changed ', self.data, ' to ', newData)
        self.data = newData
    
    def run(self):
        for x in range(20):
            threadString = 'Thread' + str(x)
            if x % 6:
                self.threadList[x] = threading.Thread(target=self.printData, args=(threadString))
            else:
                newData = self.data + str(x)
                self.threadList[x] = threading.Thread(target=self.modifyData, args=(threadString, newData))
            self.threadList[x].start()

        for x in range(20):
            self.threadList[x].join()
myVar = ReadWrite('Hello')
myVar.run()

当我运行它时,出现以下错误

Exception in thread Thread-9:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
TypeError: printData() takes 2 positional arguments but 8 were given
Exception in thread Thread-10:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
TypeError: printData() takes 2 positional arguments but 8 were given
Exception in thread Thread-11:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
TypeError: printData() takes 2 positional arguments but 8 were given

我只将一个参数threadString传递给printData function。我想知道它从哪里获得额外的 arguments? 所有帮助将不胜感激。 我是 Python 中的多线程和线程库的新手,所以我正在做这个问题作为学习练习。

我尝试在 class 之外实现线程,并让它使用 class 实例调用 function:

threadList = [0] * 20
myVar = ReadWrite('Hello')

for x in range(20):
            threadString = 'Thread' + str(x)
            if x % 6:
                threadList[x] = threading.Thread(target=myVar.printData, args=(threadString))
            else:
                newData = self.data + str(x)
                threadList[x] = threading.Thread(target=myVar.modifyData, args=(threadString, newData))
            threadList[x].start()

        for x in range(20):
            threadList[x].join()

但我得到了同样的错误。

您需要在元组中传递threadString 正如您所拥有的,它只是解压threadString本身。 从以下位置更改行:

self.threadList[x] = threading.Thread(target=self.printData, args=(threadString))

self.threadList[x] = threading.Thread(target=self.printData, args=(threadString,))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM