不确定我是否应该使用线程?
Not sure if I should use threading or not?
我会尽量保持我想做的事情尽可能简单。
我有两个 类 ClassA
和 ClassB
ClassA
有一个实例方法,其中包含运行 "infinitely" 并收集数据的 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)
下面是我的问题。我应该在 Class B 中为 "send_data_to_database()" 实例方法创建一个线程吗?我的想法是,可能产生一个线程只是为了处理将数据发送到数据库,这比实例方法没有被线程化要快。我的想法在这里错了吗?我对线程的了解是有限的。最终,我只是想找到在 Class A 识别出数据中有信号后将数据发送到数据库的最快方法。感谢所有提前回复的人。
如果满足以下任一条件,我会使用线程:
- B 中的阻塞 I/O 数据库调用会对 A 的能力产生负面影响
及时收集数据。
- 这两个数据收集部分一起会对应用程序其他部分的响应能力产生负面影响(想想无响应的 GUI)
如果这两个条件都不成立,那么单线程应用程序就简单多了。
如果您确实使用线程,请考虑使用 Queue
for concurrency。 Class A 可以 post 数据到 class 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 成为应用程序性能的限制因素时,多处理是更好的选择。根据您提供的信息,我认为多处理不适合您的项目。
我会尽量保持我想做的事情尽可能简单。
我有两个 类 ClassA
和 ClassB
ClassA
有一个实例方法,其中包含运行 "infinitely" 并收集数据的 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)
下面是我的问题。我应该在 Class B 中为 "send_data_to_database()" 实例方法创建一个线程吗?我的想法是,可能产生一个线程只是为了处理将数据发送到数据库,这比实例方法没有被线程化要快。我的想法在这里错了吗?我对线程的了解是有限的。最终,我只是想找到在 Class A 识别出数据中有信号后将数据发送到数据库的最快方法。感谢所有提前回复的人。
如果满足以下任一条件,我会使用线程:
- B 中的阻塞 I/O 数据库调用会对 A 的能力产生负面影响 及时收集数据。
- 这两个数据收集部分一起会对应用程序其他部分的响应能力产生负面影响(想想无响应的 GUI)
如果这两个条件都不成立,那么单线程应用程序就简单多了。
如果您确实使用线程,请考虑使用 Queue
for concurrency。 Class A 可以 post 数据到 class 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 成为应用程序性能的限制因素时,多处理是更好的选择。根据您提供的信息,我认为多处理不适合您的项目。