Python:有没有意义同时使用多处理和线程(对于同一个任务)?

时间:2014-10-05 18:58:24

标签: python multithreading multiprocessing

如果我有一个应用程序或功能(不能拆分),使用多线程工作速度更快,并且在使用多处理时工作速度更快,如何在每个进程中启动多个线程?

修改

我认为可以使用这样的代码:

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(...)

1 个答案:

答案 0 :(得分:1)

是的,您可以在同一个程序中同时使用多处理和多线程;虽然,这可能不常见。由于默认Python具有全局解释器锁,因此您可以使用多处理来使多个CPU或内核饱和,但如果您正在执行一些也涉及大量阻塞I / O的主要任务,则可以使用线程来增加总并行度并减少延迟。

例如,假设您正在编写各种类型的并行爬虫。在Python中解析HTML实际上是CPU密集型的,但爬行主要是网络和I / O绑定。因此,您可以使用多处理同时在单独的进程中分派多个并行爬网程序,然后在该进程中使用线程,以增加您处理的并行连接的总数。

可能还有其他一些例子可以将两者结合起来。但是,通常在我过去编写与此类似的系统时,我没有直接使用built-in Python multiprocessing library,而只是在同一台计算机上完全分开的进程,然后通过gevent库(这是一种多线程的形式)来增加并行性。我已经为多个Web服务完成了这项工作,其中每个进程都是在单独端口上提供请求,然后您可以直接在所有进程中使用某种形式的负载均衡器。这是一个非常可扩展的架构。

对于它的价值,Python多处理库,Python线程库和gevent库在它们的界面中几乎完全相同,因此你可以在所有这些之间无缝切换。