在线程中运行Class方法(python)

nac*_*bre 44 python methods multithreading class

我目前正在学习Python和Classes,我有一个基本的问题,但我没有找到任何答案.假设我有这个虚拟课程

class DomainOperations:
    def __init__(self, domain):
        self.domain = domain
        self.domain_ip = ''
        self.website_thumbnail = ''

    def resolve_domain(self):
        #resolve domain to ipv4 and save to self.domain_ip

    def generate_website_thumbnail(self):
        #generate website thumbnail and save the url to self.website_thumbnail
Run Code Online (Sandbox Code Playgroud)

我想同时运行resolve_domain和generate_website_thumbnail,当线程完成时,我想打印IP和缩略图.

编辑:我知道我应该使用线程,也许是这样的

r = DomainOperations('google.com')

t1 = threading.Thread(target=r.resolve_domain)
t1.start()

t2 = threading.Thread(target=r.generate_website_thumbnail)
t2.start()
Run Code Online (Sandbox Code Playgroud)

但是我应该在课外使用它们吗?我应该写另一个类来处理线程吗?

这样做的正确方法是什么?

A. *_*das 75

如果你从课堂上打电话给他们,就像这样简单:

import threading

class DomainOperations:

    def __init__(self):
        self.domain_ip = ''
        self.website_thumbnail = ''

    def resolve_domain(self):
        self.domain_ip = 'foo'

    def generate_website_thumbnail(self):
        self.website_thumbnail= 'bar'

    def run(self):
        t1 = threading.Thread(target=self.resolve_domain)
        t2 = threading.Thread(target=self.generate_website_thumbnail)
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        print(self.domain_ip, self.website_thumbnail)

if __name__ == '__main__':
    d = DomainOperations()
    d.run()
Run Code Online (Sandbox Code Playgroud)

  • -1:你可以在一个类中运行一个线程,但是所说的线程不会继承'self'命名空间.所以基本上没有你不能.有点重要的信息 (8认同)
  • @jasondancks我很抱歉,但你错了.请查看以下示例:http://pastebin.com/8JWzReCW.`self.resolve_domain`和`self.generate_website_thumbnail`将使用对象属性,因为`self`是两个调用的第一个参数. (5认同)
  • 呵呵.我今天无法在我的代码中使用它,因此我不得不将我的方法从类中取出并将对象作为参数传递.我道歉. (4认同)
  • @ A.Rodas pastebin不再可用.以任何方式获得另一种方式的例子?谢谢 (3认同)
  • 为什么这个问题没有标记为已解决? (2认同)
  • @SergioMorstabilini 我已经更新了代码片段,希望它有帮助! (2认同)

小智 8

您可以在DomainOperation中继承Thread类,这样代码会更加干净且易于理解。你必须重写run()方法。

from threading import Thread

class DomainOperations(Thread):
    def __init__(self, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.domain_ip = ''
       self.website_thumbnail = ''

   def resolve_domain(self):
       self.domain_ip = 'foo'

   def generate_website_thumbnail(self):
       self.website_thumbnail= 'bar'

   def run(self):
       #domain will be resolved on first thread
       self.resolve_domain()
       #thumbnail will be resolved on second OR newly created below thread
       thread2 = Thread(target=self.generate_website_thumbnail)
       thread.start()
       # thread1 will wait for thread2
       self.join()
       # thread2 will wait for thread1, if it's late.
       thread2.join()
       # here it will print ip and thumbnail before exiting first thread
       print(self.domain_ip, self.website_thumbnail)
Run Code Online (Sandbox Code Playgroud)

您将以这种方式启动您的线程。

if __name__ == '__main__':
   thread1 = DomainOperations()
   thread1.start()
Run Code Online (Sandbox Code Playgroud)

  • 这将出现 RuntimeError: thread.__init__() not call, you need to add super(DomainOperations, self).__init__(self) to __init__ 错误 (3认同)