python定义multi函数实现参数不限的乘积 python的multiply_多进程


为了提高程序并行运行的效率,我们会采取多进程和多线程的方法。

通常来说,多进程适用于计算密集型任务,多线程适用于IO密集型任务,如网络爬虫。

关于多线程和多进程的区别,请参考这个表格。


python定义multi函数实现参数不限的乘积 python的multiply_python_02


参考资料: 多线程和多进程的区别

下面将使用python标准库的multiprocessing包来尝试多线程的操作,在python中调用多线程要使用multiprocessing.dummy,如果是多进程则去掉dummy即可。

提醒特别注意,这里的多线程仍然会受到GIL(全局解释器锁)的限制,理论上并没有真正做到并发,只是在IO密集型中的任务中可以利用等待时间切换到其他线程。


from


结果非常地amazing,使用普通循环方法耗时约6s,而使用多线程方法则只要1s。

在这一部分中我们使用了map_async这个函数,此外还有一种调用多线程的方法apply_async,区别在于map_async函数只能接受单一参数,通过将迭代器分块的方式来执行,而apply函数支持传入多个参数。在这个例子中用apply_async也大约耗时1s。


start2


此外还有两个简化方法map,apply,和上面介绍的方法在于这两个方法是非异步阻塞型的,也就是一个线程出问题会将整个进程卡住。

这里稍微改动geturl函数,创建一个空列表观察哪些网址被正常运行了。当使用apply_aysnc或是map_async时程序正常运行并结束,最后的list中包含7个元素,除了那个无效网址,而当仅仅使用apply或map时我们发现,因为这个无效的网址堵塞,程序报错并退出了。


list


apply_async和map_async方法还有一个参数是回调函数,使用方法相同,区别在于前者是逐一返回回调函数,而后者则要再所有网址运行完后一次性返回,以apply_async为例:


def