1

マルチスレッドを使用して、単一のプログラムファイルでUDPサーバー側とUDPクライアント側を実行するPythonでコードを記述しようとしています。スレッドが同期していることを確認する必要があります。UDPクライアントとUDPサーバーを同じプログラムで実行するマルチスレッド

私のコードでは問題はありません。スレッド1を実行すると、thread1のrun()メソッドは永遠にwhileループを含むserverSide()メソッドを実行するため、スレッド1は解放されませんしたがってロックはプログラムに固執します。

は、誰もが確認しながら、私は、サーバーとクライアントが実行するスレッドを同期助けてくださいすることができ、適切

import threading 
import time 
import sys 
from datetime import datetime 
from socket import * 


class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     print "Starting " + self.name 
     # Get lock to synchronize threads 
     threadLock.acquire() 
     serverSide() 
     # Free lock to release next thread 
     threadLock.release() 

class myThread1 (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     print "Starting " + self.name 
     # Get lock to synchronize threads 
     threadLock.acquire() 
     clientSide() 
     # Free lock to release next thread 
     threadLock.release() 



def serverSide(): 
    serverPort = 44000 
    serverIP = '192.168.0.0' 
    serverSocket = socket(AF_INET, SOCK_DGRAM) 
    serverSocket.bind((serverIP,serverPort)) 
    print ("SERVER HERE!\nThe server is ready to receive") 
    while 1: 
     message, clientAddress = serverSocket.recvfrom(2048) 
     modifiedMessage = message.upper() 
     serverSocket.sendto(modifiedMessage, clientAddress) 


def clientSide(): 
    serverIP = "192.168.0.0" 
    serverPort = 44000 
    clientSocket = socket(AF_INET, SOCK_DGRAM) 
    message = raw_input("CLIENT HERE!\nInput lowercase sentence:") 

    clientSocket.sendto(message.encode(),(serverIP, serverPort)) 
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048) 
    print(modifiedMessage) # print the received message 

    clientSocket.close() # Close the socket 

threadLock = threading.Lock() 
threads = [] 

# Create new threads 
thread1 = myThread(1, "Thread-1", 1) 
thread2 = myThread1(2, "Thread-2", 2) 

# Start new Threads 
thread1.start() 
thread2.start() 

# Add threads to thread list 
threads.append(thread1) 
threads.append(thread2) 

# Wait for all threads to complete 
for t in threads: 
    t.join() 
print "Exiting Main Thread" 
+0

なぜthreadLockオブジェクトが必要なのですか?なぜ2つのスレッド間で同期しようとしていますか?理想的には、サーバー側とクライアント側で同期が取られないことがあります。 –

答えて

1

あなたのコードは、同期部を除いて正常に動作します。

問題はこれです.1つはthreadLock = threading.Lock()です。もう一方のスレッドで取得したスレッドは、もう1つは取得できません。

スレッドがそれを取得すると、ジョブが完了するまで解放されません。他のスレッドが起動していない限り、ジョブは実行できません。もう一方のスレッドは、第1スレッドがロックを解除するのを待機しています。

あなたは人為的にあなたのコードに競合状態を誘発するように管理していますが、これはまったく必要ありません。私は単にスレッドロックとその正常な作業で部品全体を削除しました。私はそれを終了するためにプログラムを中断しなければならなかったことを除いて。

import threading 
import time 
import sys 
from datetime import datetime 
from socket import * 


class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     print ("Starting " + self.name) 
     # Get lock to synchronize threads 
     # threadLock.acquire() 
     serverSide() 
     # Free lock to release next thread 
     # threadLock.release() 

class myThread1 (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     print ("Starting " + self.name) 
     # Get lock to synchronize threads 
     # threadLock.acquire() 
     clientSide() 
     # Free lock to release next thread 
     # threadLock.release() 



def serverSide(): 
    serverPort = 44000 
    serverIP = '127.0.0.1' 
    serverSocket = socket(AF_INET, SOCK_DGRAM) 
    serverSocket.bind((serverIP,serverPort)) 
    print ("SERVER HERE!\nThe server is ready to receive") 
    while 1: 
     message, clientAddress = serverSocket.recvfrom(2048) 
     modifiedMessage = message.upper() 
     serverSocket.sendto(modifiedMessage, clientAddress) 


def clientSide(): 
    serverIP = "127.0.0.1" 
    serverPort = 44000 
    clientSocket = socket(AF_INET, SOCK_DGRAM) 
    message = input("CLIENT HERE!\nInput lowercase sentence:") 

    clientSocket.sendto(message.encode(),(serverIP, serverPort)) 
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048) 
    print("received", modifiedMessage) # print the received message 

    clientSocket.close() # Close the socket 

# threadLock = threading.Lock() 
threads = [] 

# Create new threads 
thread1 = myThread(1, "Thread-1", 1) 
thread2 = myThread1(2, "Thread-2", 2) 

# Start new Threads 
thread1.start() 
thread2.start() 

# Add threads to thread list 
threads.append(thread1) 
threads.append(thread2) 

# Wait for all threads to complete 
for t in threads: 
    t.join() 
print ("Exiting Main Thread") 

出力:

Starting Thread-1 
Starting Thread-2 
SERVER HERE! 
The server is ready to receive 
CLIENT HERE! 
Input lowercase sentence:viki 
received b'VIKI' 

注:

私はマルチスレッドを使用して、Pythonでコードを記述しようとしています、単一のプログラムでUDPサーバ側とUDPのクライアント側を実行しますファイル。私はスレッドが同期されていることを確認する必要があります。

ほとんどの場合、クライアントサーバーのアーキテクチャは同期されていないと考えられます。 Googleサーバーとブラウザが同期していません。そして、あなたのコードに同じものが適用されるはずがありません。その理由は、クライアントが稼動しているかどうかにかかわらず、サーバーを独立して実行する必要があるからです。

クライアントは、サーバーが起動しているかどうかに関係なく実行する必要があります。サーバーが停止していると、クライアント要求は失敗します。しかし、それはまだ実行する必要があります。

+1

私はあなたに完全に同意します。サーバーとクライアントを同期させてはならず、サーバーを独立して実行する必要があります。私が同期したかった理由は、6つの異なるルータが独自のサーバとクライアントを実行するリンクステートルーティングプロトコルを実装する作業を行っているからです。したがって、各ルーターには独自のサーバーとクライアントがあり、単一のプログラムファイルで実行する必要があります。データ処理はクライアント側とサーバー側で行われているので、同期をとっていました。しかし、概念的には、同期は正しい解決策ではありません。 あなたに感謝! –

+0

まず、あなたに嬉しい新年@Areeba :) second:クライアントとサーバーの間の同期が問題を解決すると仮定した問題文があると思います。多分それは可能でしょう。しかし、正確に何を解決しようとしているのかを説明できれば、同期の有無にかかわらず解決できる別の構造を考え出すことができます。 –

+0

あなたにも幸せな新年! 問題文が長く終了するので、ここに投稿することはできません。 –

関連する問題