如果我有一个应用程序或功能(不能拆分),使用多线程工作速度更快,并且在使用多处理时工作速度更快,如何在每个进程中启动多个线程?
修改
我认为可以使用这样的代码:
class ThreadClass(threading.Thread):
def __init__(self, threads_in_queue, worker_function, *args, **kwargs):
super().__init__()
...
def run(self): # метод должен быть.
while True:
...
q = self.threads_in_queue.get()
self.worker_function(q)
threads_in_queue = multiprocessing.JoinableQueue(maxsize=number_of_threads)
class ProcessClass(...):
def __init__(self, processes_in_queue):
...
def run(self):
while True:
...
q = self.processes_in_queue.get()
threads_in_queue.put(q)
def worker_function(...):
...
for i in number_of_threads:
t = ThreadClass(worker_function, threads_in_queue, arg1, ..., kwarg1=..., ...)
t.setDaemon(True)
t.start()
if __name__ == '__main__':
processes_in_queue = multiprocessing.JoinableQueue()
for i in number_of_processes:
t = ProcessClass(processes_in_queue)
t.daemon = True
t.start()
for thing_to_queue in things_to_queue:
processes_in_queue.put(...)
答案 0 :(得分:1)
是的,您可以在同一个程序中同时使用多处理和多线程;虽然,这可能不常见。由于默认Python具有全局解释器锁,因此您可以使用多处理来使多个CPU或内核饱和,但如果您正在执行一些也涉及大量阻塞I / O的主要任务,则可以使用线程来增加总并行度并减少延迟。
例如,假设您正在编写各种类型的并行爬虫。在Python中解析HTML实际上是CPU密集型的,但爬行主要是网络和I / O绑定。因此,您可以使用多处理同时在单独的进程中分派多个并行爬网程序,然后在该进程中使用线程,以增加您处理的并行连接的总数。
可能还有其他一些例子可以将两者结合起来。但是,通常在我过去编写与此类似的系统时,我没有直接使用built-in Python multiprocessing library,而只是在同一台计算机上完全分开的进程,然后通过gevent库(这是一种多线程的形式)来增加并行性。我已经为多个Web服务完成了这项工作,其中每个进程都是在单独端口上提供请求,然后您可以直接在所有进程中使用某种形式的负载均衡器。这是一个非常可扩展的架构。
对于它的价值,Python多处理库,Python线程库和gevent库在它们的界面中几乎完全相同,因此你可以在所有这些之间无缝切换。