【发布时间】:2019-06-19 23:22:00
【问题描述】:
我会尽量让我想做的事情尽可能简单。
我有两个班级ClassA 和ClassB
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 类识别到数据中有信号时将数据发送到数据库的最快方法。感谢所有提前回复的人。
【问题讨论】:
-
线程意味着并发 - 即同时执行多个操作。您的代码完全是顺序的,一个接一个的动作:
... -> receive -> check -> send -> receive -> ...。将 single 动作卸载到线程,例如发送,通常是不值得的 - 启动线程比直接执行操作需要更长的时间。 -
如果数据中没有信号,收集到的数据会变成什么? A 级是在数据收集运行之间休眠,还是尽可能快地转动?是否存在他落后的现实风险,还是他可以自己花时间收集数据?除了这个数据收集部分,应用程序的其余部分在做什么?还是这个?
-
@bigh_29 没有信号的数据,被省略。
ClassA在数据收集运行之间不休眠。为简单起见,这几乎就是应用程序(除了正在处理的数据)。数据收集落后不存在重大风险;我主要关心的是能够在接收到该信号后尽快发送数据。 -
如果没有数据收集落后的风险,这里就不需要线程。当然不是每次要写入数据库时都打开一个线程并关闭它,这样会更慢。如果担心数据收集可能会落后,并且您希望 while 循环即使在发生写入时也能继续,那么我将永久打开一个线程,并使用第二个 while 循环监视队列(来自标准 Python 库)。将数据库写入请求发送到队列,并在第一个线程继续时让第二个线程处理它们。
-
@KyleDeGennaro 进程甚至比线程更昂贵。如果你没有任何事情可以并发做,那么并发做事情是没有意义的。如果您不知道您是否同时有任何事情要做,我们也无法告诉您。归根结底,并发是权衡成本与收益,而您两者都没有定义。转换需要多长时间?发送需要多长时间?接收需要多长时间?在出现问题之前,发送可以延迟接收多长时间?您是否受 CPU 或 I/O 限制?等等……
标签: python python-3.x multithreading python-multithreading