'''
使用 multiprocessing.Manager:
Manager 提供了一个可以在不同进程之间共享和修改的数据类型，如 list, dict, Namespace 等。
它实际上是在背后启动了一个单独的服务器进程，其他进程通过代理来访问这些共享对象。
'''
# 使用 multiprocessing.Manager 来完成统计词频
# 怎么得到最快的一个结果，是一个试错过程：X程创建数目多少、分片的大小 ...

from cppy.cp_util import *
from collections import Counter
from multiprocessing import Manager, Process

stop_words = get_stopwords()

def process_chunk(chunk,word_count):    
    words = [ w for w in chunk if ( not w in stop_words ) and len(w) >= 3 ]    
    for word in words: # 非常化时间
        word_count[word] = word_count.get(word, 0) + 1
    # word_count.update( Counter(words) ) # 类型不起作用

@timing_decorator
def main():   
    manager = Manager()
    word_count = manager.dict()

    chunks = get_chunks(testfilepath,2800)    
    print('-------------------',len(chunks))
    processes = []
    for chunk in chunks:
        p = Process(target=process_chunk, 
                    args=(chunk,word_count) )
        processes.append(p)
        p.start()

    for p in processes:  p.join()

    word_count = dict(word_count)  
    word_freqs = Counter(word_count).most_common(10)      
    print_word_freqs(word_freqs)    

if __name__ == '__main__':
    main()