不知道我是否应该使用线程?

时间:2019-06-19 14:13:44

标签: 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类认识到数据中存在信号之后将数据发送到数据库。感谢所有提前答复的人。

1 个答案:

答案 0 :(得分:2)

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

  • 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成为应用程序性能的限制因素时,多处理是一个更好的选择。根据您提供的信息,我认为多处理不适合您的项目。