Meme游戏服务器开发日记(二)绕过GIL启动多线程Python环境

说道Python和多线程,很容易想到GIL,GIL意味着只要是用Python做的多线程程序,就无法利用多个CPU。

经过一些失败的尝试后,我也一度认为GIL是无解的。我们甚至把注意力转向了IronPython等无锁Python,但是实际上那样问题可能更多,比如我们不熟悉mono,mono也没达到完全成熟的程度。

直到skynet的QQ群里一位朋友介绍了另一种加载so的方式,事情才有了180度的变化。

方法如下:

1、编译Python源码,编译时加上参数--enable-shared,编译成so动态链接库。

2、找到so,拷贝N份,分别命名为 libpython_1.so, libpython_2.so, ... 等等

3、用C语言,使用linux下的ldfcn库,动态加载这些so库,ldfcn可以保证同名全局变量不冲突。

(C语言源码,待整理)

(编译注意事项,待整理)

(设置环境变量,待整理)

用简单Py脚本测试,会发现脚本的运行确实是独立的。但是如果用了 import time,则会造成段错误。

原因是用这种方法,以后import的各种python的库,如果是C语言扩展的,那么就会因为重复而冲突。

解决方法是在编译Python时,加入--enable-time,把time库和python库编译到一起,就能解决这个问题。

(另一种备选方案是找到time源码,在库名后加上数字,也编出N份time_1, time_2... 等等,在脚本里也分别import不同的time库,即可。)

由于我们的Python环境禁止在脚本内启动多线程,所以可以加入编译参数--without-threads,这样还能稍微提高一点运行效率。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 21:16:13

Meme游戏服务器开发日记(二)绕过GIL启动多线程Python环境的相关文章

Meme游戏服务器开发日记(一)目标

到了新的环境,老大让我有空研究下一代服务器技术,作为一个长期任务. 新的服务器想达到的目标: 1.分布式系统,对象(Entity)之间的关系类似于Actor模型. 2.逻辑服务,是单进程.多线程的,对象之间发消息进行通信,但是简单读取属性尽可能做到直接. 3.必须使用Python语言.开发方式类似于BigWorld引擎. 这个目标还是很宏伟的,只能从底层一步一步攻克.在这里记录一下解决问题的过程,既是分享,也是督促自己不要半途而废. 我个人极度喜欢skynet框架,由于很多原因,skynet框架

Meme游戏服务器开发日记(四)scons编译工具、C和C++混合使用

今天在编译python so时出现点问题--把其他C库链接到同一个so里--尝试了一早上发现了方法,已经更新到本系列的第二节里了. 整理了一下工程目录,打算用scons管理. scons毕竟是一种新型的build工具,比makefile肯定有很大进步,至少更清晰好学,少了很多晕晕的trick.但是相比其他高级工具比如cmake之类的,就不清楚优劣了. 这个例子写的过于简单了,正常使用时多用env,可以统一参数,简化编写. 例子: obj = Object( "test.c", CPPP

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.

erlang 游戏服务器开发

http://blog.csdn.net/slmeng2002/article/details/5532771 最近关注erlang游戏服务器开发  erlang大牛写的游戏服务器值得参考 介绍本文以我的OpenPoker项目为例子,讲述了一个构建超强伸缩性的在线多游戏玩家系统.OpenPoker是一个超强多玩家纸牌服务器,具有容错.负载均衡和无限伸缩性等特性.源代码位于我的个人站点上,大概10,000行代码,其中1/3是测试代码. 在OpenPoker最终版本敲定之前我做了大量调研,我尝试了D

游戏服务器开发技术选型

开发语言的选择 业界主要的是c/c++ + Python/lua模式做游戏服务器.c/c++做网络通讯数据传输,python/lua做业务逻辑.这样既保持了网络传输的效率(c++),又提升开发效率(Python/lua),同时也支持热更新. 当然,也有其他服务器开发语言,erlang(页游公司用的多),node.js(少量游戏用的,还有一个node.js写的引擎叫pemolo) 开源服务器引擎 1.firefly(9秒社团开发的一款python游戏服务器框架) 2.kbengine(作者说他按b

Python游戏引擎开发(二):创建窗口以及重绘界面

开发本地应用之前,我们得先有个窗口,用于显示界面.其次我们还得实现重绘机制,使游戏不停地刷新,达到动态化的目的.所以我们的引擎开发的第一个阶段就是创建窗口和重绘界面. 以下是之前的文章: Python游戏引擎开发(一):序 Qt的渲染机制 在上一章<序>中我们讲到本次开发用到了PyQt,也就是Qt的Python版.在开始实现引擎功能之前我们要先了解一下Qt,这里先了解渲染机制. 在Qt中,绘画用到的类叫做QPainter,顾名思义,就是个画家类吧.在这个类中,提供了非常多的方法用于操控这个&q

棋牌游戏服务器架构: 详细设计(二) 应用层设计

这里的应用层,指的是CenterServer.LogonServer.LogServer.RoomServer等几个服务器,另外还包括游戏模块的设计.不过游戏模块和前4个服务器的设计很不相同.这里先说一下服务器应用的详细设计. 这上面提到的4个服务器都需要响应客户端(这里的客户端的意思是泛指)的请求,进行数据库操作,同时还要能够配置,以及显示系统运行的状态信息等.这里会采用MVC模式来组织应用层逻辑 . 图1  Application层基本结构 IController从ITCPServiceOb

多线程游戏服务器开发(2)-编写网络库

网络库功能介绍 网络库具有的功能 1.具备多线程 2.监听某个端口 3.连接远程服务器 4.保存并管理所有链接,外部与网络库操作通过链接ID 5.向某个连接发送数据 6.强制关闭某个链接 7.网络事件回掉:connect, receive, close 8.错误处理 网络库主要接口(文件:tcp_frame.h) class tcp_frame { public: /** * tcp_frame 构造函数 * @handler 网络事件回掉(connect, recevie, close) *

手游服务器开发技术详解

从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术.(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多) 一.聊聊服务器开发有哪些东西要考虑. 1.开发语言的选择: 工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用. 业界主要的是c/c++ + Python/lua模式做游戏服务器.c/c++做网络通讯数据传输,python/lua做业务逻辑.这样既保持