【问题标题】:Classes & concurrent futures multithreading类和并发期货多线程
【发布时间】:2020-02-19 14:04:25
【问题描述】:

我刚刚开始了解 python 中类的概念,我希望改进我的脚本。基本上,我的脚本使用请求库检查各种 URL 的状态,并对收到的数据进行其他后处理。目前,我的脚本充满了函数,并且将相同的参数传递给每个函数。我面临的问题是我正在使用 concurrent.futures 多线程,但不确定如何使用它来调用类而不是函数。

我只是在下面做一个简单的测试,以便能够在处理后从类中检索字典。但是,它返回给我一个类对象,我不知道如何从类对象中提取数据。

我的课程的目的是我想用它来获取每个 url 的状态并进行一些后期处理并返回字典。

from concurrent.futures import ThreadPoolExecutor

class capture_screenshot(object):
    def __init__(self, customer_data):
        self.customer_data = customer_data

    def complex_function(self):
        ....
        self.customer_data = processed_data

url_dict = {"url_0": "https://redacted.com/a", "url_1": "https://redacted.com/b", ...}

with ThreadPoolExecutor(max_workers=16) as executor:
    processed_results = list(executor.map(capture_screenshot, url_dict.items()))

print(processed_results) # This should be "https://redacted.com/a but I am getting a class object
processed_results : [<capture_screenshot object at 0x0000020443...>, <capture_screenshot object at 0x0000020443...>]

非常感谢。

【问题讨论】:

  • 它返回给我一个类对象是什么意思?可以发minimal reproducible example吗?
  • @AMC 我已根据您的要求修改了代码。
  • 那不是类,那些是实例。您尚未定义表示。
  • 查看 ˋ__repr__ˋ 和 ˋ__str__ˋ 方法的文档。它们定义了实例的显示方式。
  • 从你的描述看来,一个类似乎不合适。一般来说,如果一个类只有ˋ__init__ˋ和ˋ__call__ˋ,那么定义一个函数是一种复杂的方式。

标签: python python-3.x multithreading class


【解决方案1】:

我认为processed_results = list(executor.map(capture_screenshot, url_dict)) 只是初始化对象(调用__init__ 方法)。 这就是你接收对象的原因。

我认为您还需要在初始化后执行对象。 试试这样的:

with ThreadPoolExecutor(max_workers=16) as executor:
    processed_results = list(executor.map(capture_screenshot, url_dict.items()))

results = [res.customer_data for res in processed_results]

【讨论】:

  • 我试过你的解决方案,效果很好,谢谢!
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2020-08-26
  • 2022-06-10
  • 2021-05-09
相关资源
最近更新 更多