不能在另一个函数

时间:2017-05-01 11:02:44

标签: python

我试图在另一个函数中操作字典clean_txt中的列表,但它不起作用,我最终得到了dict中的空列表。

我的理解是,列表和dicts都是可变对象,所以这里有什么问题?

def process_questions(i, question_list, questions, question_list_name):
    ''' Transform questions and display progress '''
    print('processing {}: process {}'.format(question_list_name, i))
    for question in questions:
        question_list.append(text_to_wordlist(str(question)))

@timeit
def multi(n_cores, tq, qln):
    procs = []
    clean_txt = {}
    for i in range(n_cores):
        clean_txt[i] = []

    for index in range(n_cores):
        tq_indexed = tq[index*len(tq)//n_cores:(index+1)*len(tq)//n_cores]
        proc = Process(target=process_questions, args=(index, clean_txt[index], tq_indexed, qln, ))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

    print('{} records processed from {}'.format(sum([len(x) for x in clean_txt.values()]), qln))
    print('-'*100)

2 个答案:

答案 0 :(得分:1)

您正在使用进程而非线程。

创建过程后,会复制程序的内存,并且每个过程都在自己的集合上工作,因此不共享

这是一个可以帮助您理解的问题:Multiprocessing vs Threading Python

如果您想在进程之间共享内存,则应该查看semaphores或使用Threads。还有其他共享数据的解决方案,如队列或数据库等。

答案 1 :(得分:1)

您要从其他进程追加clean_txt[index]clean_txt[index]属于创建它的主要python进程。由于进程无法访问或修改其他进程的内存,因此无法附加到该进程。 (不是真的。见下面的编辑)

您需要创建共享内存。

您可以使用Manager创建共享内存,类似这样的内容

from multiprocessing import Manager
manager = Manager()
...
    clean_txt[i] = manager.list()

现在,您可以在其他流程中附加到此列表中。

修改 -

我对clean_txt的解释并不清楚。感谢@Maresh。

创建新的Process时,将复制整个内存。因此,修改新进程中的列表不会影响主进程中的副本。所以你需要一个共享内存。