玩蛇网提供最新Python编程技术信息以及Python资源下载!

Python中使用fork是否适合?

通常在java开发中采用单进程多线程的方式开发,因为JVM实在是太大了。但是在python中由于gil的原因,采用多线程方式无法很好的利用多核,那这样出了协程以外,就只能采用fork的方式了。

python中fork的代价有多大?

我纯粹来作为字面党回答下楼主“Python中fork的代价有多大”:

写一段C++的代码和Python的代码,都是做同样的事,fork10000次,每次创建子进程后立刻结束子进程。

#!/usr/bin/env python
# coding: utf-8

import time
import os

start = time.time()
for i in range(10000):
    pid = os.fork()
    if pid == 0:
        os._exit(0)
print time.time() - start # 单位为秒
#include <ctime>
#include <iostream>
#include <unistd.h>

int main()
{
    int pid;
    std::clock_t c_start = std::clock();
    for (int i = 0; i < 10000; ++i) {
        if ((pid = fork()) == 0) {
            _exit(0);
        }
    }
    std::cout << (std::clock() - c_start) / 1000 <<" ms\n";
    return 0;
}

结果:python版本用时3秒左右,C++版本用时700多毫秒。python :c++为4倍左右。
考虑到一般情况下python跟c++在运行效率上的差异,这个差距算是很好了。

c++是直接使用系统调用fork函数,所以python中fork的代价现在应该很明了。

python多线程确实存在无法有效利用多核的情况。可以采用多进程方式,用multiprocessing这个库。不需要你去手动的fork。此外python的fork底层应该调用的就是linux的fork系统调用,所以代价不会很大。
关于multiprocessing,下面是一段示例代码:

from multiprocessing import Pool

def worker(src):
    handle(src)

if __name__ == "__main__":
    pool = Pool(100)
    src_list = get_src_list()
    ret = pool(worker, src_list)
    print(ret)

上面就是一个100进程的进程池,src_list是待处理的数据,进程池会自动把其中项目分配给不同的worker进程去处理,可以有效利用多核。

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19360.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月22日 - 11时18分55秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules