问题标签 [python-stackless]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3274 浏览

python - 需要关于 MMORPG 数据模型设计、数据库访问和无堆栈 python 的建议

我正在开发一款回合制休闲MMORPG游戏服务器。

处理网络、多线程、定时器、服务器间通信、主游戏循环等的低级引擎(不是我们编写的)是用 C++ 编写的。高级游戏逻辑由 Python 编写。

我的问题是关于我们游戏中的数据模型设计。

起初,我们只是尝试在客户端登录时将播放器的所有数据加载到 RAM 和共享数据缓存服务器中,并安排一个计时器定期将数据刷新到数据缓存服务器,数据缓存服务器将数据持久化到数据库中。

但是我们发现这种方法存在一些问题

1)一些数据需要立即保存或检查,例如任务进度,升级,物品和金钱收益等。

2)根据游戏逻辑,有时我们需要查询一些离线玩家的数据。

3)一些全局游戏世界数据需要在不同的游戏实例之间共享,这些实例可能运行在不同的主机上,也可能是同一主机上的不同进程。这是我们需要一个位于游戏逻辑服务器和数据库之间的数据缓存服务器的主要原因。

4)玩家需要在游戏实例之间自由切换。

下面是我们过去遇到的困难:

1)所有的数据访问操作都应该是异步的,避免网络I/O阻塞主游戏逻辑线程。我们必须向数据库或缓存服务器发送消息,然后在回调函数中处理数据回复消息并继续进行游戏逻辑。编写一些中度复杂的游戏逻辑,需要与db多次对话,并且游戏逻辑分散在许多回调函数中,难以理解和维护,很快就会变得痛苦。

2) ad-hoc 数据缓存服务器使事情变得更加复杂,我们很难保持数据的一致性和有效地更新/加载/刷新数据。

3) 游戏内数据查询效率低下且繁琐,游戏逻辑需要查询库存、物品信息、头像状态等很多信息。还需要一些事务机制,例如如果一个步骤失败则整个操作回滚. 我们尝试在 RAM 中设计一个好的数据模型系统,构建大量复杂的索引以简化大量信息查询,添加事务支持等。很快我意识到我们正在构建的是内存数据库系统,我们正在重新发明轮子。 ..

最后我转向stackless python,我们移除了缓存服务器。所有数据都保存在数据库中。游戏逻辑服务器直接查询数据库。借助stackless python的micro tasklet和channel,我们可以同步编写游戏逻辑。它更容易编写和理解,生产力也大大提高。

事实上,底层的 DB 访问也是异步的:一个客户端 tasklet 向另一个专用 DB I/O 工作线程发出请求,该 tasklet 在一个通道上被阻塞,但整个主游戏逻辑没有被阻塞,其他客户端的 tasklet 将被调度并自由奔跑。当 DB 数据回复时,阻塞的 tasklet 将被唤醒并继续在“断点”上运行(继续?)。

通过上述设计,我有一些问题:

1)DB访问会比以前的缓存解决方案更频繁,DB可以支持高频率的查询/更新操作吗?近期是否需要一些成熟的缓存方案如redis、memcached?

2) 我的设计中是否存在严重的缺陷?你们能给我一些更好的建议吗,尤其是关于游戏内数据管理模式。

任何建议将不胜感激,谢谢。

0 投票
1 回答
5136 浏览

python - PyPy 和 PyPy + greenlet 中的 Stackless - 区别

新版本的 PyPy 附带集成的Stackless。据我所知,捆绑的 Stackless 与 2001 年的原始 Stackless 不同,并有延续。所以主要是带有调度程序的绿色线程框架。

Greenlet是 Stackless 的衍生版本,它提供 Stackless 绿色线程功能作为扩展模块。

PyPy使用“本机” Stackless比使用PyPy + greenlet + 一些调度程序(例如:gevent)有什么好处吗?或者问题是我不能在 PyPy 中使用这些类型的扩展?更具体地说:我知道 PyPy 有自己的 greenlet 实现(基于continulet)。但我很好奇将外部greenlet 与gevent 和PyPy 中的内部链接的可能性。

PyPy 是否带有用于 Stackless 的异步 IO 库而不是标准库?

我知道stackless本身和python的其他异步轻线程扩展(eventlet、gevent、twisted ...)。所以我不是在寻找它们之间的差异,而是来自 pypy 和无堆栈构建的优势。

0 投票
1 回答
637 浏览

continuations - 为什么 PyPy 1.7 不实现“无堆栈”堆栈?

PyPy 1.7 的默认构建包含无堆栈,不提供在没有递归深度限制的情况下运行的能力(以直接方式)。

为什么?

Previus 构建的 PyPy 具有无堆栈支持函数调用和尾递归的延续风格。

我不是在问涉及协程的解决方案,而是在寻找集成 stackelss 的问题。

0 投票
2 回答
1010 浏览

python - stackless python安装后无法导入stackless

我使用了pycharm和eclipse+pydev,还为mac os x安装了stackless python(2.7.1)。当我尝试导入 stackless 时,总是有提示“找不到这样的包/引用”,但是当我切换到 IDLE/Client 时,“import stackless”是正确的。我真的不知道原因,请帮助我。多谢

0 投票
3 回答
284 浏览

python - 是否可以将无堆栈 python 2.7.2 与 pythondotnet 一起使用?

平台:Windows 7 假设两者都是 32 位版本。

我目前的理解是这是不可能的,因为两个安装过程都涉及替换 python.exe 本身。

我想每个来源都必须合并才能从两者中获得功能?

无堆栈 Python:http: //zope.stackless.com/

用于 .NET 的 Python:http: //pythonnet.github.io/

我们在 IronPython 上使用 Python for .NET,因为我们想要访问所有的 cpython 库(例如 matplotlib 等)。

0 投票
1 回答
907 浏览

python - 无堆栈 Python 中 TCP/IP IPC 的首选方法是什么?

Stackless python 允许您序列化一个任务(酸洗)以供以后在同一台机器上执行:http: //www.stackless.com/wiki/Pickling

我的问题是无堆栈 python 是否提供任何类型的 IPC、中间件、服务代理或 DDS 技术来在进程和/或机器之间移动这些腌制任务?我们真的需要在这里使用套接字吗?

他们有一个很好的频道概念:http: //www.stackless.com/wiki/Pickling

如果通道可以跨机器工作,并且您可以简单地在网络上向服务代理注册通道,那将是非常棒的。本质上,允许您将任务移动到位于不同机器上的不同无堆栈 python 服务。

0 投票
0 回答
172 浏览

network-programming - stacklesssocket 影响其他基于套接字的模块

我有一个使用 Stackless Python 和 stacklesssocket.py 的项目。我最近决定将 Couchbase 添加到我的项目中作为我的数据库后端服务器。我按照(Couchbase 站点)的说明进行了此操作。但是它似乎与我的项目不兼容,并且进一步调查似乎与stacklesssocket发生冲突。

显示我的项目的源代码会过于复杂,但我将代码提炼成一个完全重现我得到的错误的案例:

如您所见,我正在添加 stacklesssocket,然后尝试连接到 Couchbase 服务器。症状是下面的堆栈跟踪。我不确定 stacklesssocket 究竟做了什么,但我知道它取代(或增强)了普通 python 套接字的功能。所以看起来 Couchbase 正在使用一个套接字并且它的行为不像预期的那样:

为了证明 Couchbase 通常对我有用(总是一个很好的完整性检查),这里是有效的代码。我只是删除了导入stacklesssocket的代码:

它按预期工作并生成以下输出:

我正在使用无堆栈 python 2.6.5。有没有我可以使用的解决方法?还是 Couchbase 模块只是简单且与 stacklesssocket 不兼容?我真的很想继续使用 stackless python 和 stacklesssocket,因为我的项目是一个具有许多并发连接的网络服务器。我很欣赏人们的任何想法。

0 投票
3 回答
861 浏览

java - 在java中模拟线程调度(stackless java?)

对于一些学术研究,我需要模拟在单个处理器上运行的多个线程。

我希望能够在我的代码中插入 *call_scheduler()* 调用,其中当前的“线程”将暂停(记住它在哪个代码行中)并且一些调度函数将决定放开哪个线程。

在 python 中,这可以使用无堆栈 python 巧妙地实现。有java替代品吗?

我可以使用真正的线程和一些消息队列(或管道)来实现它,这将强制一次只运行一个线程 - 但这是一个丑陋且有问题的解决方案。

0 投票
3 回答
591 浏览

python - 从什么“种类”的 Python 开始?

我想学习 python,所以我从 python 站点下载了它,我看到出现了 4 种其他类型的 python:

  • 蟒蛇(正常)
  • 铁蟒
  • 杰通
  • 派皮
  • 无堆栈 Python

我真的可以找到这些之间的不同之处。还有哪一个是最好的开始。

0 投票
1 回答
122 浏览

python - 当stderr指向多线程无堆栈python脚本上的文件时输出丢失

考虑以下四行(全部相同),它们从日志文件中产生相同数量的行:

现在,考虑完全相同的行,除了不计算来自 stderr 的行,我们计算从 stderr 读取的文件的行:

请注意,当我将 stderr 发送到文件时,行数会有所不同。

-T 选项指定无堆栈 python 脚本正在使用的线程数,当我将其设置为一个线程时,我会得到一致的结果。因此,这似乎与可以写入最后一位输出之前完成的某些事情有关。尽管如此,我观察到该脚本实际上每次都完成了它的任务(尽管没有完全记录它)。

我很困惑为什么日志输出会根据我发送标准错误的位置而有所不同。我也很困惑为什么线程数也会影响这一点,尽管脚本完成了它的任务(所以它不会过早结束)。

如果有人能帮助我理解这里发生的事情,我将不胜感激。谢谢!