파이썬과 함께 스레드 및 대기열을 사용하여 시저 암호를 구현하는 프로그램을 작성했습니다. 내 코드에서 다중 처리를 사용하여 모든 스레딩 작업을 변경하고 싶습니다. 어떻게 처리해야할지 모르겠습니다. & 구현을 시작하는 방법을 설명 할 수 있다면 감사하겠습니다.코드 (파이썬)에서 멀티 프로세싱으로 멀티 스레딩을 변경하는 방법
import threading
import Queue
import sys
import string
lock = threading.Lock()
def do_work(in_queue, out_queue, shift):
while True:
lock.acquire()
item = in_queue.get()
result = caesar(item, shift)
out_queue.put(result)
in_queue.task_done()
lock.release()
def caesar(plaintext, shift):
plaintext = plaintext.upper()
alphabet = string.ascii_uppercase
shifted_alphabet = alphabet[shift:] + alphabet[:shift]
table = string.maketrans(alphabet, shifted_alphabet)
return plaintext.translate(table)
if __name__ == "__main__":
if len(sys.argv) != 4:
print("Duzgun giriniz: '<filename>.py s n l'")
sys.exit(0)
else:
s = int(sys.argv[1])
n = int(sys.argv[2])
l = int(sys.argv[3])
work = Queue.Queue()
results = Queue.Queue()
myfile=open('metin.txt','r')
text_data=myfile.read() # <=== here load file
index=0
for i in xrange(n):
t = threading.Thread(target=do_work, args=(work, results, s))
t.daemon = True
t.start()
for i in range(0, len(text_data), l):
work.put(text_data[index:index + l])
index += l
work.join()
index=0
output_file=open("crypted"+ "_"+ str(s)+"_"+str(n)+"_"+str(l)+".txt", "w")
for i in range(0, len(text_data), l):
output_file.write(results.get())
index += l
sys.exit()
'do_work'의 잠금이 문제입니다. 하지만 어쨌든 거기 있으면 안됩니다. 'Queue.get'는 이미 스레드로부터 안전하기 때문에 여러분은 그것을 보호하지 않습니다. 대신 모든 스레드가 해당 잠금을 기다리는 동안 한 스레드는 작업을 수행합니다. 멀티 스레드 응용 프로그램을 효율적으로 싱글 스레드했습니다. – tdelaney
대부분의 코드를'multiprocessing.Pool' 풀로 대체하고'map' 메소드를 사용할 수 있습니다. 추가적인 이점으로,'multiprocessing.pool.ThreadPool'은 같은 인터페이스를 가진 쓰레드 버전을 구현합니다. – tdelaney