我編寫了一個使用python實現線程和隊列的caesar-cipher的程序。我想在代碼中改變所有的多線程工作,我不知道該怎麼做。如果你能解釋如何開始執行,我將不勝感激。這裏是代碼:如何在代碼中使用多處理來更改多線程(Python)
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'已經是線程安全的,所以你沒有保護它。相反,當1個線程完成工作時,所有線程都會在該鎖上等待。你已經有效地單線程你的多線程應用程序。 – tdelaney
您可以用'multiprocessing.Pool'池替換大部分代碼並使用其'map'方法。作爲一個額外的好處,'multiprocessing.pool.ThreadPool'實現一個具有相同接口的線程版本。 – tdelaney