UDP 메시지를 수집하고 1 초마다 처리하는 응용 프로그램을 작성 중입니다. 수신 메시지 목록을 변경하는 것이 위험하지 않고 : 나는 쉽게 (델 self.listener.messages [길이 0]) 목록에서 시작 값을 제거 할 수 있는지 확실하지 않다이 python 코드 스레드가 안전합니까 (꼬인 스레드)?
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
import threading
import time
class UdpListener(DatagramProtocol):
messages = []
def datagramReceived(self, data, (host, port)):
self.messages.append(data)
class Messenger(threading.Thread):
listener = None
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
time.sleep(1)
recivedMessages = self.listener.messages
length = len(recivedMessages)
messagesToProccess = recivedMessages[0:length]
#doSomethingWithMessages(messagesToProccess)
del self.listener.messages[0:length]
print(length)
listener = UdpListener()
messenger = Messenger()
messenger.listener = listener
messenger.start()
reactor.listenUDP(5556, listener)
reactor.run()
: 같은
응용 프로그램 프로토 타입 보인다 응용 프로그램이 충돌합니다.
업데이트 - 잠금 버전
class Messenger(threading.Thread):
listener = None
lock = threading.Lock()
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
time.sleep(1)
recivedMessages = self.listener.messages
self.lock.acquire()
try:
length = len(recivedMessages)
messagesToProccess = recivedMessages[0:length]
del self.listener.messages[0:length]
except Exception as e:
raise e
finally:
self.lock.release()
#doSomethingWithMessages(messagesToProccess)
print(length)
했다 추측 * 보통 * 당신이 경우 여기 callingLater과 트릭에 대한 –