Python中使用fork是否适合?,Python使用fork,通常在java开发中采用
Python中使用fork是否适合?,Python使用fork,通常在java开发中采用
通常在java开发中采用单进程多线程的方式开发,因为JVM实在是太大了。但是在python中由于gil的原因,采用多线程方式无法很好的利用多核,那这样出了协程以外,就只能采用fork的方式了。
python中fork的代价有多大?
我纯粹来作为字面党回答下楼主“Python中fork的代价有多大”:
写一段C++的代码和Python的代码,都是做同样的事,fork10000次,每次创建子进程后立刻结束子进程。
#!/usr/bin/env python# coding: utf-8import timeimport osstart = 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 Pooldef 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进程去处理,可以有效利用多核。
编橙之家文章,
相关内容
- win系统安装scipy失败问题,提示没有BLAS的原因是什么?
- 求教python数组、序列与迭代综合应用问题,python数组
- python 3版本程序在调用shell 指令怎么样才能获得返回值
- psycopg2使用遇到InternalError错误是什么原因,,执行完第
- 在python里面怎么样使用socket连接,pythonsocket连接,尝试连
- python中证明x的平方加上y的平方等于3,没有有理数解?
- pycharm运行scrapy除了cmd外还有别的吗,pycharmscrapy,目前启
- 使用Python解析豆瓣网API的源码解析,pythonapi,为何我在浏
- Python语法lft[-1]>=rgt[-1]应该怎么解读,lftrgt,def me
- 求Python遍历有元组的列表思路,python遍列表思路,item=
评论关闭