将参数传递给Python线程

4
我在我的类中有一个叫做“interaction”的方法:
class Interaction:

    def PreparaThreadBrowser(self, User, Password):
       t = ThreadBrowser(args=(User, Password), )
       t.start()

这是一个调用带有用户和密码作为参数的线程的代码:
然后,我有一个名为“ThreadBrowser”的类,其具有以下“run”方法:
class ThreadBrowser(threading.Thread):

    def run (self, user, password):

        self.User = user
        self.Pass = password
        print(self.User, self.Pass)

但事实证明,我肯定在发送参数到线程函数方面遇到了困难,因为它会出现执行错误:
TypeError: run() missing 2 required positional arguments: 'user' and 'password'
有什么解决办法吗?

你能修正一下缩进,并添加实际调用 ThreadBrowser.run() 的代码吗? - Primusa
@Primusa Thread.run 会被 Thread.start 自动调用。 - user4815162342
2个回答

2
args 构造函数参数不能提供额外的参数给 run。它为 target 提供参数,而你没有指定。具体来说:
  • run() 的默认实现调用 self.target(*self._args, **self._kwargs),其中 _args_kwargs 由构造函数提供,并分别默认为空元组和字典。

  • 通过实现 run,你选择了不自动调用 Python 的 target(*args)。然后就轮到你的代码存储状态,以便你的 run 方法可以获取它。惯用的方法是在构造函数中存储它,就像你现在的 run 方法一样。

例如:
class ThreadBrowser(threading.Thread):
    def __init__(self, user, password):
        super(ThreadBrowser, self).__init__()
        self.User = user
        self.Pass = password

    def run(self):
        print(self.User, self.Pass)
ThreadBrowser可以像这样自然地构建:ThreadBrowser(username, password),然后像以前一样使用t.start()启动。

这很有道理,但它会给出编译错误:https://imgur.com/a/F0SPLME - Gonçalo Baptista
1
@GonçaloBaptista 这个错误似乎是一个无关的混合使用 tab 和空格的问题。答案中的代码一致使用空格; 你是复制/粘贴它吗? - user4815162342
是的,我不知道不能复制粘贴。抱歉。它起作用了:D 非常感谢你。 - Gonçalo Baptista

0

Run 接受 2 个参数 user 和 pass

import threading



class Interaction:
    def PreparaThreadBrowser(self, User, Password):
        t = ThreadBrowser(args=(User, Pass), )
        t.start()



class ThreadBrowser(threading.Thread):

    def run (self, user, password):
        self.User = user
        self.Pass = password
        print(self.User, self.Pass)



t = ThreadBrowser()
t.run("user", "pass")

如果我像你告诉我的那样使用,参数会正确地传递到运行方法中,但线程不会被调用! - Gonçalo Baptista
直接调用 run 是错误的,线程必须始终使用 start() 方法来调用。 - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接