python – 为什么多线程和单线程之间没有执行时间差异

我正在尝试学习python语言及其概念.我写了一些代码来玩多线程.但我注意到多线程和单线程之间没有执行时间差异.

运行脚本的机器有4个核心/线程.

 def get_tokens(file_name,map):
    print(file_name)
    counter = 0
    with open(file_name,'r',encoding='utf-8-sig') as f:
        for line in f:
            item = json.loads(line,encoding='utf-8')
            if 'spot' in item and item['sid'] == 4663:
                counter+=1
                if counter == 500:
                    break
                tokens = nltk.word_tokenize(item['spot'],language='english')
                for token in tokens:
                    if token not in map:
                        map[token] = 1
                    else:
                        map[token] = map[token] + 1;

 start_time = time.time()
 map = dict();
 with ThreadPoolExecutor(max_workers=3) as executor:
    for file in FileProcessing.get_files_in_directory('D:\\Raw Data'):
        future = executor.submit(FileProcessing.get_tokens, file, map)

 end_time = time.time()
 print("Elapsed time was %g seconds" % (end_time - start_time))

原始数据中的每个文件大小都大于25 MB.所以我认为它们之间必须存在差异.但事实并非如此.为什么?我在代码或多线程概念中犯了错误吗?

最佳答案
CPython(Python的标准实现)不支持在不同的CPU上进行多线程处理.因此,您确实可以拥有多个线程,但它们都将在同一个CPU上运行,并且您不会对CPU绑定进程进行速度改进(您可以使用I / O绑定进程).

原因是臭名昭着的GIL(全球翻译锁定). Python的核心不是线程安全的,因为它进行垃圾收集的方式,因此它使用锁,这意味着访问python对象的线程一个接一个地运行.

在您的特定情况下,您正在进行一些I / O和一些处理.在python中进行多处理时会产生很大的开销,而I / O的速度增益无法补偿(读取文件的时间与处理文件的时间相比可能很小).

如果你需要做真正的多线程,请看Cython(不要与CPython混淆)和“no_gil”,或c-extensions,或多处理模块.

转载注明原文:python – 为什么多线程和单线程之间没有执行时间差异 - 代码日志