首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在代码中使用多处理更改多线程(Python)

如何在代码中使用多处理更改多线程(Python)
EN

Stack Overflow用户
提问于 2016-11-30 23:42:23
回答 1查看 653关注 0票数 0

我写了一个程序,用python实现了线程和队列的caesar-cipher。我想在我的代码中用多处理来改变所有的线程工作,但我不知道该怎么做。如果您能解释一下在哪里以及如何开始实现,我将不胜感激。代码如下:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2016-12-01 00:08:27

您可以节省一些代码,转而使用标准的multiprocessing.Pool实现。

代码语言:javascript
复制
import multiprocessing
import sys
import string
import itertools

# for non-forking systems like Windows
def worker(args):
    # args: (text, shift)
    return caesar(*args)

# for forking systems like linux
def forking_worker(args):
    # args: ((start_index, end_index), shift)
    return caesar(text_data[args[0][0]:args[0][1], args[1])

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])

    pool = multiprocessing.Pool() # todo: change number of cpus...
    with open('metin.txt') as myfile:
        text_data=myfile.read() # <=== here load file

    # on a forking system so only pass index, not text to child
    result = pool.map(forking_worker, 
        zip(((index, index + l)
            for index in range(0, len(text_data), l)),
            itertools.cycle([s])))

    with open("crypted"+ "_"+ str(s)+"_"+str(n)+"_"+str(l)+".txt", "w") as output_file:
        output_file.writelines(result)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40892434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档