問題タブ [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) アドホック データ キャッシュ サーバーは物事をより複雑にします。データの一貫性を維持し、データを効果的に更新/読み込み/更新することは困難です。

3) ゲーム内データのクエリは非効率的で面倒です。ゲーム ロジックは、インベントリ、アイテム情報、アバターの状態などの多くの情報をクエリする必要があります。たとえば、1 つのステップが失敗した場合、操作全体をロールバックする必要があるなど、いくつかのトランザクション メカニズムも必要です。 . 私たちは、RAM 内に優れたデータ モデル システムを設計し、多数の情報クエリを容易にするために多くの複雑なインデックスを構築し、トランザクション サポートを追加しようとしています。すぐに、私たちが構築しているのはインメモリ データベース システムであることに気付きました。車輪を再発明しているのです。 ..

最後に、スタックレス python に目を向けます。キャッシュ サーバーを削除しました。すべてのデータはデータベースに保存されます。ゲーム ロジック サーバーはデータベースに直接クエリを実行します。スタックレス python のマイクロ タスクレットとチャネルを使用すると、ゲーム ロジックを同期して記述できます。記述と理解がはるかに簡単になり、生産性が大幅に向上します。

実際、基礎となる DB アクセスも非同期です。1 つのクライアント タスクレットが別の専用 DB I/O ワーカー スレッドにリクエストを発行し、タスクレットがチャネルでブロックされますが、メインのゲーム ロジック全体はブロックされず、他のクライアントのタスクレットがスケジュールされます。そして自由に走る。DBデータが応答すると、ブロックされたタスクレットが起動され、「ブレークポイント」で実行され続けます(継続?)。

上記の設計で、いくつか質問があります。

1) DB アクセスは以前のキャッシュ ソリューションよりも頻繁になります。DB は高頻度のクエリ/更新操作をサポートできますか? 近い将来、redis、memcached などの成熟したキャッシュ ソリューションが必要になりますか?

2) 設計に重大な落とし穴はありますか? 特にゲーム内のデータ管理パターンについて、より良い提案をしていただけませんか。

任意の提案をいただければ幸いです、ありがとう。

0 投票する
1 に答える
5136 参照

python - PyPy および PyPy + greenlet でのスタックレス - 違い

PyPy の新しいバージョンには、統合されたStacklessが同梱されています。私が知る限り、同梱されている Stackless は、2001 年から継続されている元の Stackless と同じではありません。つまり、主にディスパッチャーを備えたグリーン スレッド フレームワークです。

Greenletは Stackless のスピンであり、拡張モジュールとして Stackless のグリーン スレッド機能を提供します。

PyPy + greenlet + 一部のディスパッチャー (例: gevent )よりも、PyPyから「ネイティブ」スタックレスを使用する利点はあります? または問題は、PyPy でこれらのタイプの拡張機能を使用できないことですか? より具体的に言うと、PyPyにはgreenletの独自の実装があることを知っています( continuletに基づいています)。しかし、PyPyで外部グリーンレットをgeventと内部グリーンレットにリンクする可能性に興味があります。

PyPy には、標準ライブラリの代わりにスタックレスを使用するための非同期 IO ライブラリが同梱されていますか?

スタックレス自体と、Python に対する他の非同期ライト スレッド拡張機能 (eventlet、gevent、twisted...) を知っています。だから私はそれらの違いを見ているのではなく、スタックレスで構築されたpypyから得られる利点です。

0 投票する
1 に答える
637 参照

continuations - PyPy 1.7が「スタックレス」スタックを実装しないのはなぜですか?

スタックレスが含まれているPyPy1.7のデフォルトのビルドでは、再帰の深さの制限なしで(まっすぐに)実行する機能は提供されません。

なんで?

スタックレスサポート継続スタイルの関数呼び出しと末尾再帰を備えたPyPyのPreviusビルド。

コルーチンを含むソリューションについては質問していませんが、統合スタッケルの問題を探しています。

0 投票する
2 に答える
1010 参照

python - スタックレス python インストール後にスタックレスをインポートできない

pycharm と eclipse+pydev を使用し、mac os x 用のスタックレス python(2.7.1) もインストールしました。スタックレスをインポートしようとすると、「そのようなパッケージ/参照が見つかりません」というヒントが常にありますが、IDLE/クライアントに切り替えると、「スタックレスをインポートする」が正しいです。原因がよくわかりません、助けてください。どうもありがとう

0 投票する
3 に答える
284 参照

python - pythondotnetでスタックレスpython2.7.2を使用することは可能ですか?

プラットフォーム:Windows7両方の32ビットバージョンを想定しています。

私の現在の理解では、両方のインストールプロセスでpython.exe自体を置き換える必要があるため、これは不可能です。

両方から機能を取得するには、それぞれのソースをマージする必要があると思いますか?

Stackless Python: http: //zope.stackless.com/

Python for .NET: http: //pythonnet.github.io/

あらゆる種類のcpythonライブラリ(特にmatplotlib)にアクセスしたいので、IronPythonではなくPythonfor.NETを使用しています。

0 投票する
1 に答える
907 参照

python - スタックレス Python での TCP/IP IPC の推奨される方法は何ですか?

スタックレス python を使用すると、同じマシン上にある必要のないタスク (pickling) を後で実行するためにシリアル化できます: http://www.stackless.com/wiki/Pickling

私の質問は、スタックレス python は、これらのピクルされたタスクをプロセスやマシン間で移動するための IPC、ミドルウェア、サービス ブローカー、または DDS テクノロジを提供しますか? ここで本当にソケットを使用する必要があるのでしょうか?

彼らはチャンネルのこの素晴らしいコンセプトを持っています: http://www.stackless.com/wiki/Pickling

チャネルがマシン間で機能し、ネットワーク上のサービス ブローカーにチャネルを簡単に登録できるとしたら、それはすばらしいことです。要するに、タスクを別のマシンにある別のスタックレス python サービスに移動できるようにします。

0 投票する
0 に答える
172 参照

network-programming - stacklesssocket は他のソケットベースのモジュールに影響します

Stacklesssocket.py で Stackless Python を使用するプロジェクトがあります。私は最近、Couchbase をプロジェクトに追加して、データベースのバックエンドとしてサーバーに追加したいと考えました。( Couchbaseサイト)の指示に従ってこれを行いました。ただし、私のプロジェクトとは互換性がないようです。さらに調査すると、stacklesssocket との衝突のようです。

私のプロジェクトのソースを表示するのは非常に複雑だったでしょうが、私が得たエラーを正確に再現するケースまでコードを要約しました:

ご覧のとおり、stacklesssocket を追加してから、Couchbase サーバーに接続しようとしています。症状は、以下のスタック トレースです。stacklesssocket が何をするのか正確にはわかりませんが、通常の python ソケットの機能を置き換える (または強化する) ことはわかっています。したがって、Couchbase がソケットを使用していて、期待どおりに動作していないようです。

Couchbase が通常どおり機能することを証明するために (常に適切なサニティ チェックが行われます)、機能するコードを次に示します。stacklesssocket をインポートするコードを単純に削除しました。

これは期待どおりに機能し、次の出力が生成されました。

スタックレス python 2.6.5 を使用しています。これを回避する方法はありますか? それとも、Couchbase モジュールは単純で、単純にスタックレスソケットと互換性がないのでしょうか? 私のプロジェクトは多数の同時接続を持つネットワーク サーバーであるため、スタックレス python とスタックレス ソケットを引き続き使用したいと考えています。人々の考えに感謝します。

0 投票する
3 に答える
861 参照

java - Java でのスレッド スケジューリングのシミュレーション (スタックレス Java?)

いくつかの学術研究では、単一のプロセッサで実行される複数のスレッドをシミュレートする必要があります。

コード内に *call_scheduler()* 呼び出しを挿入できるようにしたいと考えています。このコードでは、現在の「スレッド」が一時停止し (どのコード行にあるかを覚えています)、スケジューリング関数によって、どのスレッドを解放するかが決定されます。

Python では、これはスタックレス Python を使用してきちんと実装できます。Javaの代替手段はありますか?

実際のスレッドと、一度に 1 つのスレッドのみを強制的に実行するいくつかのメッセージング キュー (またはパイプ) を使用して実装することもできますが、これは見苦しく問題のある解決策です。

0 投票する
3 に答える
591 参照

python - そもそもPythonの「種類」は何ですか?

Pythonを学びたいので、Pythonサイトからダウンロードしましたが、他に4種類のPythonが表示されています。

  • Python(通常)
  • IronPython
  • Jython
  • PyPy
  • スタックレスPython

これらの違いは本当にわかります。また、どちらから始めるのが最適ですか。

0 投票する
1 に答える
122 参照

python - マルチスレッドのスタックレス python スクリプトで stderr がファイルを指している場合、出力が欠落する

ログ ファイルから同じ数の行を生成する次の 4 行 (すべて同じ) を考えてみましょう。

ここで、stderr からの行をカウントする代わりに、stderr から読み取られたファイルの行をカウントすることを除いて、まったく同じ行を考えてみましょう。

stderr をファイルに送信する場合、行数が異なることに注意してください。

-T オプションは、スタックレス Python スクリプトが使用しているスレッドの数を指定します。これを 1 つのスレッドに設定すると、一貫した結果が得られます。したがって、これは、出力の最後のビットが書き込まれる前に何かが終了することに関連しているようです。それでも、スクリプトが実際に毎回そのタスクを完了することを観察しました (完全にログに記録していないにもかかわらず)。

stderr を送信している場所によってログ出力が異なる理由に困惑しています。また、スクリプトがタスクを終了しているにもかかわらず、スレッドの数がこれに影響を与える理由についても困惑しています (したがって、途中で終了することはありません)。

ここで何が起こっているのかを理解するのを手伝ってくれる人がいれば幸いです。ありがとう!