1

我想在一个程序文件中运行UDP服务器端和UDP客户端的多线程中使用python编写代码。我需要确保线程是同步的。多线程在同一个程序中运行UDP客户端和UDP服务器

问题(据我所知)与我的代码是,当thread1运行时,它获得锁,因为thread1的run()方法运行serverSide()方法,其中包含永久while循环,thread1不释放锁,因此,程序卡住了。

任何人都可以请帮助,同时确保我同步线程的服务器和客户端运行正常

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对象?你为什么试图在两个线程之间进行同步。理想情况下,服务器端和客户端不会有任何同步。 –

回答

1

你的代码工作正常,除了同步部分。

所以问题是这样的,有一个threadLock = threading.Lock()曾经获得的两个线程之一,其他线程将无法获得。

线程一旦获得它,它就不会释放它,直到它的工作完成。除非另一个线程正常运行,否则就无法完成工作。另一个线程正在等待第一个线程释放锁定。

您已经人为设法在您的代码中引发竞争条件,而这并不是必需条件。我只是用线程去除了整个部分并且工作正常。除了我不得不中断程序来结束它。

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

我完全同意你的看法。服务器和客户端不应该同步,服务器应该独立运行。我想同步的原因是因为我一直在努力实现链路状态路由协议,其中六个不同的路由器将运行他们自己的服务器和客户端。因此,每个路由器都有自己的服务器和客户端,它们应该在单个程序文件中运行。由于数据处理是在客户端和服务器端完成的,我想同步它们。但从概念上说,同步并不是正确的解决方案。 谢谢你! –

+0

首先,祝你新年快乐@Areeba :)第二:我认为你有一个问题陈述,你认为客户端和服务器之间的同步将解决它。也许会。但是,如果你能解释你到底想要解决什么问题,也许我们可以想出一个不同的结构来解决这个问题。 –

+0

祝你新年快乐! 问题陈述是退出很长时间,所以我不认为我可以在这里发帖 –