問題タブ [twisted.internet]

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 投票する
1 に答える
1947 参照

python - ツイスト:同じソケットにデータを書き込んだ後にクライアントソケットから読み取る方法は?

次の操作を順番に実行する必要がある単純な TCP サーバーをツイストで作成しようとしています。

  1. クライアントがサーバーに接続し、KEEPALIVEこの接続のフラグが 1 に設定されます。
  2. サーバーはクライアントからデータを受け取ります。
  3. 次に、リストである応答を計算します。
  4. 次に、サーバーはリストの各項目を 1 つずつ送信し、その間にクライアントからの明示的な ACK を待ちます。つまり、リストから 1 つの項目を送信した後、サーバーはクライアントからの ACK パケットを待ち、ACK を受信した後でのみ待ちます。残りのアイテムも同じ方法で送信しますか。

コードは次のとおりです。

サーバーとクライアントを実行すると、次の例外が発生します。

Resource temporarily unavailable

この例外の理由は理解しています。非ブロッキング ソケットでブロッキング メソッドを呼び出そうとしています。

この問題の解決策を見つけるのを手伝ってください。

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

python - Twisted および非同期プログラミングの理解。コードが機能し、別のコードが機能しないのはなぜですか?

最初に申し訳ありませんが、テキストの壁。Twisted および非同期プログラミング全般を理解するのに苦労しています。

Twisted 15.4.0 で Python 2.7 を使用しています。

この例を downloadPage() で試してみましたが、完全に機能します。

コールバックをラムダから適切な関数に変更して、少しいじりました。出来た。また、reactor.stop() ステートメントをコールバックとエラーバックの両方から削除しようとしましたが、唯一の効果は、ダウンロード後にスクリプトが停止しないことです。イベントループがまだ実行されているため、これは理にかなっています。

また、壊れた URL を指定してみました。

downloadPage() への呼び出しが 1 つしかない場合、プログラムはブロックされます。エラーバックは発生しません。

2 つの呼び出しがあり、1 つは壊れた URL で、もう 1 つは正しい URL である場合、呼び出しが実行され、終了し、コールバックが起動され (正しいものと仮定します)、終了します。

私の最初の質問は、なぜこれが起こるのですか? 壊れた URL に対してエラーバックが発生しないのはなぜですか? 壊れた URL でエラーが発生するべきではありませんか?


次のような別のコードがあります。

このコードは機能しません。「1」と「2」が出力されますが、コールバックやエラーバックの呼び出しはありません。また、ページは「foo」にダウンロードされません。

2 番目の質問は、このコードが機能しないのはなぜですか? While ループのせいでしょうか。もしそうなら、while ループは deferred とそのコールバック チェーンにどのように影響しますか?


編集 1:「While True」を 3 回の反復後に終了する「While 条件」に変更しました。ファイルがダウンロードされ、コールバックが呼び出されます。無限ループがダウンロードを妨げているのはなぜですか?

また、While ループ内の「# Do some other non twisted stuff」行は、パイプからの読み取りを実行します。ここで URL を取得します。

URL を継続的に読み取り、ダウンロードが完了した瞬間にコールバックをスケジュールする最善の方法は何ですか?


編集 2:コードを次のように変更しました。

コードの構造を、callWhenRunning() が receive_some_data 関数を呼び出し続ける (無限ループのように) という考え方に変更しました。そうではありません。

この関数を呼び出し続けるイベントループを取得するにはどうすればよいですか?


編集3:これを何とか機能させることができました。Looping Callメソッドについて知りました。Looping Call を使用して x 秒ごとにEdit 2からコードを呼び出します。できます。他の方法はありますか?


ありがとう!

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

python - Understanding Python Twisted Looping Call - Save the return of the LoopingCall function

I am using Twisted and making a Looping Call every x seconds.

The function I use for the looping calls makes a return statement.

How can I retrieve the return result of f?

Thanks!

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

python - Twisted Python - 2 つのループ呼び出し、指定された間隔に従って 1 つが起動しない

次のような構造のプログラムがあります。

f1 には、いくつかのブロッキング操作を処理するいくつかの deferred があります。このようなもの:

f2 はログを記録します。ねじれたコードはありません。

f1 で何が起こっても、f2 は 10 秒ごとにログを記録することを期待します。

しかし、そうではありません。f2 は、50 秒から 2 秒間隔の非常にワイルドな間隔で呼び出されます。

なぜこうなった?

編集1:

リクエストにより、f2 コード:

f2 はオブジェクトのメソッドですが、このオブジェクトはヘルパーであり、実際には操作を実行しません。オブジェクト f2 は、データ ホルダーの一部です。

編集 2

したがって、ロギング時間 (f2) は、f1 に必要な時間に直接関連しています。f1 が開始から終了まで 30 秒を必要とする場合、ログ間の時間 (f2) も 30 秒になります。f1 が some_blocking_operation() を待っている間に f2 を呼び出すべきではありませんか?

編集 2 の補遺:

f1 へのループ呼び出しをコメントすると、f2 のループ呼び出しが適切に機能する (10 秒ごとにログが記録される) ため、問題は明らかに f1 の結果です。

私がやっていることをよりよく説明するために、f1 のより詳細なスケッチを追加します。

編集3:

これは、f1 で何が起こっているかのより詳細なスケッチです。

ワークフローは次のようなものです。

  1. パイプから入力を取得します ( read はブロックされていないため、 f2 には影響しません)
  2. 入力がリストだとします。リストの各要素で何かを行います。
  3. リストの各要素に対して行われる「何か」は、ブロッキング操作です。ただし、それはかなり短く、通常は 0.5 ~ 1 秒以内です。
  4. その操作の完了時に、エラーが発生しなかった場合は、別のブロック操作を行う 2 番目のコールバックを起動します。通常、これには 1 ~ 2 秒かかります。
  5. 出力パイプへの書き込み

個々のブロック操作には少し時間がかかります。私はそれが複合効果であると推測し始めています。すべてinputに 50 個のアイテムがあるため、各アイテムが終了するのに 1 ~ 2 秒かかる場合、取得するログ時間は理にかなっています。

ただし、私の質問は残っています。入力内のアイテムがブロック操作を実行している間に f2() を起動するべきではありませんか?

編集 4

わかりましたので、動作することがわかっているバージョンに戻しました。コールバックは 10 秒ごとに発生していました。今、そうではありません。これは本当に奇妙です。入力のアイテムのサイズがこれと関係があるのではないかと思います。

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

python - Python SSH サーバー (twisted.conch) コマンドのフィルタリングとポート転送

次のことを行う SSH サーバーを作成する必要があります (ジョブには twisted.conch が選択されています)。

  1. ポート転送を実行します (添付のコードではそれが行われず、何を変更すればよいかわかりません)
  2. コマンドを実行する前にフィルター処理します (または、少なくとも実行前または実行後にログに記録します)。

以下に添付されたコードは、完璧な SSH および SFTP サーバーを作成しますが、1 つの主要コンポーネントが欠けています - ポート転送 (およびコマンド フィルタリングですが、ポート転送ほど重要ではありません)

可能な限り探しましたが、この 2 つを見つけることができませんでした。助けてください。これがパズルの最後の平和です。

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

python - Twisted スレッドの外でデータを処理する方法

応答として API 呼び出しを実行する UDP リスナーを作成しようとしていますが、受信した UDP データグラムに含まれるデータに基づいています。callMultipleInThreads は、単一のスレッドで両方の関数を実行しているようです。UDP データグラムを受信すると、functionOne が終了し、functionTwo が (API 呼び出しを実行するために) 新しいスレッドで開始されることを期待していましたが、そうではないようです。

私はスレッドコードを書くのが初めてです。2 番目の関数が functionOne の終了をブロックしないようにするにはどうすればよいでしょうか? funtionTwo で API 呼び出しをフォークする方がよい方法でしょうか?

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

python - autobahn / twisted websocket サーバーを再起動する方法 / 例外後にアップしたままにする方法

私はautobahnを使用してonMessageのコードを実行するwebsocketサーバーを持っています。

このコード中に例外が発生し、エラーをログに記録できるように try/except 句を実行すると、正しくログが記録されます。ただし、クライアント(javascript)への接続は切断されます。

問題は、新しいページをロードすると、websocket サーバーに再接続しないことです。while ループでサーバーを起動するコード ブロックを配置しようとしましたが、クライアントが正常に接続しません。

「onMessage」のコードに例外があっても、websocket サーバーは引き続き接続を受け入れ、他のクライアントに実行の機会を与えるようにする方法を知っている人はいますか?