質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

614閲覧

Pythonで複数のサーバにTelnet接続を行いたい

mizuhisa

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2023/05/02 13:45

前提

Pythonでマルチスレッドを使用して、複数のサーバに同時にデータを受信するプログラムを作成しています。

発生している問題・エラーメッセージ

2つのスレッドで、それぞれ別のサーバに接続しているのですが、
1つのスレッドで片方のサーバに接続すると、別のスレッドでもう片方へのサーバへの接続ができず待たされてしまいます。
同時に接続することはできないでしょうか。

Telnet1_Start!!!!!!!!!
Telnet2_Start!!!!!!!!!
Telnet2_Connet!!!!!!!!!

該当のソースコード

Python

1 2# スレッドで実行する関数の準備 3def worker1(): 4 print ("Telnet1_Start!!!!!!!!!") 5 with Telnet("192.168.100.177", 23) as tn: 6 print ("Telnet1_Connet!!!!!!!!!") 7 tn.read_until("OK".encode('ascii')) 8 9# スレッドで実行する関数の準備 10def worker2(): 11 print ("Telnet2_Start!!!!!!!!!") 12 with Telnet("192.168.100.178", 23) as tn: 13 print ("Telnet2_Connet!!!!!!!!!") 14 tn.read_until("OK".encode('ascii')) 15 16# 関数を実行するスレッドの準備 17t1 = threading.Thread(target=worker1) 18t2 = threading.Thread(target=worker2) 19 20# スレッドの開始 21t1.start() 22t2.start()

試したこと

socketを使用してTCPでサーバに接続してもも同様でした。

補足情報(FW/ツールのバージョンなど)

実行環境は
Python 3.11
Window11

KenRoda👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/05/02 15:00

サーバー側の問題な気がします。 Windowsのtelnetクライアントを有効にしていなければしてから、 コマンドプロンプトを2つ開いて、それぞれでそれぞれのtelnetコマンドを同時に実行するとどうなります が?
melian

2023/05/02 16:18

Python 3.11.2 で試してみましたが問題ありません。worker1 の Telnet() に timeout を設定して実行してみてください。 with Telnet("192.168.100.177", 23, timeout=5) as tn:
guest

回答1

0

この問題は、スレッドが同時に実行されないことが原因である可能性が高いです。Pythonのグローバルインタープリターロック(GIL)の制約により、Pythonスレッドは同時に実行されず、それぞれが一度に1つのタスクを実行します。マルチスレッドではなくマルチプロセスを使用することで、この問題を解決できるかもしれません。

該当のソースコードをマルチプロセスに修正します:

python

1from multiprocessing import Process 2from telnetlib import Telnet 3 4# プロセスで実行する関数の準備 5def worker1(): 6 print ("Telnet1_Start!!!!!!!!!") 7 with Telnet("192.168.100.177", 23) as tn: 8 print ("Telnet1_Connet!!!!!!!!!") 9 tn.read_until("OK".encode('ascii')) 10 11# プロセスで実行する関数の準備 12def worker2(): 13 print ("Telnet2_Start!!!!!!!!!") 14 with Telnet("192.168.100.178", 23) as tn: 15 print ("Telnet2_Connet!!!!!!!!!") 16 tn.read_until("OK".encode('ascii')) 17 18# 関数を実行するプロセスの準備 19p1 = Process(target=worker1) 20p2 = Process(target=worker2) 21 22# プロセスの開始 23p1.start() 24p2.start() 25 26# プロセスが終了するまで待機 27p1.join() 28p2.join()

このコードは、multiprocessingモジュールを使用してプロセスを生成し、それぞれのプロセスが異なるサーバーに接続します。この方法で、GILの制約を回避し、異なるサーバーへの同時接続が可能になります。

投稿2023/05/02 14:34

KenRoda

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/05/02 15:03

ある瞬間に同時に動いている必要は無く、片方が待ちになっている間に他方は動けば良いので関係ないのでは? 。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問