여러 스레드에서 액세스해야하는 경우 (읽기/쓰기/크기 가져 오기) 파이썬 목록에 잠금 장치가 필요한지 궁금하십니까? Mac에서 Python 2.7 사용하기.다중 스레드 환경에서 Python 2.7 목록을 보호하려면 잠금이 필요합니까?
나는 목록을 보호하기 위해 잠금 장치를 추가하기 위해 프로토 타입을 작성했습니다. 내 코드에서 필요한 경우 또는 모든 문제 (성능 및 기능면에서)가 확실하지 않은 경우 감사.
BTW, 나는 파이썬 사전과 deque에 관해서 멀티 스레드 환경에서 락을 보호 할 필요가 있는지에 관해서도 같은 질문을한다. 감사.
import threading
import time
import random
class checkStatus:
def __init__(self):
self.message = []
self.lock = threading.Lock()
def checkInStatus(self, msg):
self.lock.acquire()
self.message.append(msg)
self.lock.release()
def checkOutStatus(self):
self.lock.acquire()
if len(self.message) > 0:
msg = self.message.pop(0)
else:
msg = 'Queue empty'
self.lock.release()
return msg
def checkMessageStatus(self):
self.lock.acquire()
size = len(self.message)
self.lock.release()
return size
messageQueue = checkStatus()
class myThread (threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
global messageQueue
while True:
time.sleep(1+5*random.random())
print "%s: %s : %s" % (self.name, time.ctime(time.time()), messageQueue.checkMessageStatus())
time.sleep(1 + 5 * random.random())
msg = time.ctime(time.time()) + ' ' + self.name
print "%s: %s : check in message, %s" % (self.name, time.ctime(time.time()), msg)
messageQueue.checkInStatus(msg)
time.sleep(1 + 5 * random.random())
print "%s: %s : check out message, %s" % (self.name, time.ctime(time.time()), messageQueue.checkOutStatus())
if __name__ == "__main__":
threads = []
# Create new threads
thread1 = myThread(1, "Thread-1")
thread2 = myThread(2, "Thread-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"
출력,
Thread-2: Tue Aug 30 22:08:04 2016 : 0
Thread-1: Tue Aug 30 22:08:05 2016 : 0
Thread-1: Tue Aug 30 22:08:07 2016 : check in message, Tue Aug 30 22:08:07 2016 Thread-1
Thread-2: Tue Aug 30 22:08:07 2016 : check in message, Tue Aug 30 22:08:07 2016 Thread-2
Thread-2: Tue Aug 30 22:08:09 2016 : check out message, Tue Aug 30 22:08:07 2016 Thread-1
Thread-1: Tue Aug 30 22:08:11 2016 : check out message, Tue Aug 30 22:08:07 2016 Thread-2
Thread-2: Tue Aug 30 22:08:11 2016 : 0
Thread-1: Tue Aug 30 22:08:13 2016 : 0
Thread-2: Tue Aug 30 22:08:15 2016 : check in message, Tue Aug 30 22:08:15 2016 Thread-2
Thread-1: Tue Aug 30 22:08:17 2016 : check in message, Tue Aug 30 22:08:17 2016 Thread-1
Thread-2: Tue Aug 30 22:08:18 2016 : check out message, Tue Aug 30 22:08:15 2016 Thread-2
Thread-1: Tue Aug 30 22:08:19 2016 : check out message, Tue Aug 30 22:08:17 2016 Thread-1
멀티 스레딩에서 CPython 구현에는 한 번에 하나의 스레드 만 활성화되도록 GIL (Global Interpreter Lock)이 있습니다. 따라서 자물쇠가 필요하지 않습니다. –
내부적으로 스레드를 멈추고 (가장 안전한 방법) 모든 스레드에 대해'pause','stop','lock' 조건을 만들어야합니다. 추가 상태는'Failed'이고'while True :'는 threading의 악몽입니다. 플래그를 처리하지 않으면 데이터 및 데이터 방식이 손상됩니다. 일부 데이터 또는 프로세스가 스레드에 있지만 '오류 및 오류'발생시 많은 조합을 제외하고 '동기 및 내부 데이터 바인딩'을 제외합니다. – dsgdfg
@ super_cr7, 기본 동작을 변경하는 방법이 있습니까? –