python - 多线程在同一程序中运行UDP客户端和UDP服务器

标签 python multithreading synchronization python-multithreading

我正在尝试使用多线程在Python中编写代码,在单个程序文件中运行UDP服务器端和UDP客户端。我需要确保线程同步。

我的代码的问题(据我所知)是,当 thread1 运行时,它会获取锁,因为 thread1 的 run() 方法运行包含永远 while 循环的 serverSide() 方法,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"

最佳答案

除了同步部分之外,您的代码工作正常。

所以问题是这样的,有一个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'

注意:

i am trying to write a code in python, using multithreading, that runs UDP server side and UDP client side in a single program file. i need to make sure that the threads are synchronized.

客户端服务器架构在大多数情况下不应该同步。谷歌服务器和我的浏览器不同步。而且它们不应该同样适用于您的代码。原因是服务器应该独立于客户端是否运行而运行。

客户端应该独立运行,无论服务器是否启动。如果服务器关闭,客户端请求将失败。但它仍然应该运行。

关于python - 多线程在同一程序中运行UDP客户端和UDP服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41385014/

相关文章:

java - 如何确保线程调用 wait() 之后发生事件?

python - 带 Python 的 DB-API

python - Postgres 和 Docker 在文件更改时重新部署

python - 有什么官方方法可以获取模型的管理选项吗?

python - 如何将多个python文件转换为EXE?

c# - 为什么从我的网络应用程序转换视频时 ffmpeg 永远不会完成?

c++ - 多线程事件检查器不打印任何东西

c++ - OpenMP 第一个内核比第二个内核慢得多

java - 同步方法中的并发修改异常

java - 只读同步