python - 不确定我是否应该使用线程?

标签 python python-3.x multithreading python-multithreading

<分区>

我会尽量让我想做的事情尽可能简单。

我有两个类 ClassAClassB

ClassA 有一个实例方法,其中包含一个“无限”运行并收集数据的 while 循环。 ClassA 也传递了一个 ClassB 的实例。在 ClassA 收集此数据的同时,它还会检查传入的数据以查看是否已接收到特定信号。如果已收到信号,则调用 ClassB 中的实例方法。

考虑以下主程序驱动程序:

from class_a import ClassA
from class_b import ClassB

database_connection = MongoDB #purely example
class_b = ClassB(database_connection)
class_a = ClassA(class_b)

然后是类:

Class class_a:

    def __init__(self, class_b):
        self.class_b

    def collect_data(self):
        while True:
            data = receiver()
            if (signal in data):
                self.class_b.send_data_to_database(data)

Class class_b:

    def __init__(self, database):
        self.database = database

    def convert_data(self, data):
        return data + 1

    def send_data_to_database(data):
        converted_data = convert_data(data)
        self.database.send(converted_data)

现在是我的问题。我是否应该为 B 类中的“send_data_to_database()”实例方法创建一个线程?我的想法是,可能产生一个线程只是为了处理将数据发送到数据库,这比实例方法没有被线程化要快。我的想法在这里错了吗?我对线程的了解是有限的。最终,我只是想找到最快的方法,在 A 类识别出数据中有信号后将数据发送到数据库。感谢所有提前回复的人。

最佳答案

如果其中任何一个为真,我会使用线程:

  • B 中的阻塞 I/O 数据库调用会对 A 的能力产生负面影响 及时收集数据。
  • 这两个数据收集部分一起会对应用其他部分的响应能力产生负面影响(想想无响应的 GUI)

如果这两个条件都不成立,那么单线程应用程序就会少很多麻烦。

考虑使用 Queue for concurrency如果你确实使用线程。 A类可以将数据发布到B类正在等待的队列中。这是我的意思的一个简单的代码示例:

from queue import Queue
from threading import Thread, Event

class class_a:
    def __init__(self, queue):
        self.queue = queue
        self.thread = Thread(target=self.collect_data)
        self.thread.start()

    def collect_data(self):
        for data in range(1000):
            if data % 3 == 0:
                print(f'Thread A sending {data} to queue')
                self.queue.put(data)
            else:
                print(f'Thread A discarding {data}')

class class_b:
    def __init__(self):
        self.queue = Queue()
        self.thread = Thread(target=self.process_data)
        self.thread.daemon = True
        self.thread.start()

    def process_data(self):
        while True:
            data = self.queue.get()
            print(f'Thread B received {data} from queue')

b = class_b()
a = class_a(b.queue)

最后,任何时候当你考虑在 Python 中使用并行时,你都必须问是否 multiprocessing比多线程更有意义。当 CPU 计算而非文件或网络 I/O 成为应用程序性能的限制因素时,多处理是更好的选择。根据您提供的信息,我认为多处理不适合您的项目。

关于python - 不确定我是否应该使用线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56669811/

相关文章:

java - 如何使用 VisualVM 或使用 unix 命令杀死 java 线程?

java - 如何打印出当前在特定非线程类上运行的线程名称?

python - 为什么 Selenium 给我一个不区分大小写的 Style 属性?

python - 按值复制变量而不是引用

python - 使用列表理解查找列表中的元素,其中另一个列表中的所有元素都是因子

Python asyncio 缓冲和处理数据

用于启动字典的 Python 字典语法

python - 如何在 python 中将非常大的数字加起来为 1

python-3.x - 为 pymysql 导入 AWS lambda 层

c# - 锁定字典上的 Dictionary Add() 异常