弱极了,请教 Python 多线程如何快速开始

2023-06-02 01:39:15 +08:00
 pathetique
文科轻拍

晚上用 python 写雍正实录的词汇统计

雍正的起居官特别能写,一百三十多万字,用 M1 pro 的电脑,半个小时才检索到三万多字(算法应该没问题),看了看 cpu ,只有一个 100%的占用

有没有特别简单的 python 多线程调用入门,希望自己能理解的那种?

不知道问清楚没有
4324 次点击
所在节点    Python
53 条回复
noneusername
2023-06-02 01:40:46 +08:00
边看文档,边让 GPT 输出示例测试
ysc3839
2023-06-02 02:03:57 +08:00
CPU 密集运算用 Python 的多线程是没用的,需要多进程
这种情况手动分段然后开多几个同时跑就好了
Weixiao0725
2023-06-02 02:15:59 +08:00
看一下 multiprocessing.Pool
suith27
2023-06-02 02:19:25 +08:00
shalingye
2023-06-02 03:28:45 +08:00
你需要的是多进程,简单得很,这是我的模板:
if __name__=='__main__':
from multiprocessing import Pool # 导入进程池
path=choosefolder()
p = Pool() # 创建进程池,留空代表 Cpu 的逻辑内核数目
while True:
try:
for n in range(1,1000):
p.apply_async(download, args=(n,path)) # 向进程池中添加任务
except:
p.close() # 结束向进程池中添加任务(后续不能再使用 apply_async 方法添加新任务)
p.join() # 实现进程同步
break
shalingye
2023-06-02 03:33:46 +08:00
缩进寄了,自己排吧,choosefolder 和 download 都是函数名,args 代表 download 函数的参数,如果只有一个参数需要写成 n,的形式,把你需要分割处理的函数替换到 download 的位置
fyq
2023-06-02 06:22:27 +08:00
如果只有一个文档的话,最简单的方法是手动拆分成好几个,然后同时针对拆分后不同的的文档运行你的程序去分析,时候再针对得到的结果汇总一下就好了。
liyafe1997
2023-06-02 06:38:04 +08:00
Python 的多线程是假的,忘了这东西吧,要干正事得看多进程 multiprocessing.Pool
lovelylain
2023-06-02 08:28:04 +08:00
python 有个著名的 GIL 锁,执行 Python 代码时都需要先获取这个锁,所以虽然多线程,但同一时间只有一个线程获得这个锁,其他线程都在等待,结果只能跑满一个核。如果你是 c 模块处理,可以手动释放锁处理完再获取,这样多线程就能突破单核限制。但 c 模块开发效率和可移植性很差,更好的方案是上面提到的 multiprocessing 多进程。
tulongtou
2023-06-02 08:29:29 +08:00
卧槽,现在文科生都这么优秀了么,卷到理科生这边来了
litguy
2023-06-02 08:33:23 +08:00
多进程,每个进程处理其中的一部分东西,最后所有进程结果汇总
strawberrydafu
2023-06-02 08:34:04 +08:00
检索具体是在干什么?半小时才 3 万字我怀疑算法本身有很多优化空间
Kinnice
2023-06-02 08:39:30 +08:00
词汇统计,m1 ,半小时 3w 字,看起来算法不像是没有问题
ohayoo
2023-06-02 08:40:27 +08:00
其实可以用第三方的任务队列库,自带多进程多线程选项,只需要关注自己的逻辑函数即可,都可以尝试对比下
adoni
2023-06-02 11:15:57 +08:00
参见: https://adoni.github.io/2019/01/07/python-practice/#concurrent-and-multi-process

```python
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=16) as exe:
result = exe.map(func, data_list)
```

另外,你可以直接改成单线程,看一下,我感觉 130 万字,分分钟跑完。
aijam
2023-06-02 11:54:43 +08:00
"半个小时才检索到三万多字",这得多慢啊,口算可能都比这个快
coderluan
2023-06-02 12:27:34 +08:00
这个你问 chatgpt 更方便,最简单应该是 concurrent.futures.ThreadPoolExecutor ,然后用 subprocess 调用你的程序开多进程。
killva4624
2023-06-02 12:30:22 +08:00
多进程记得考虑进程安全
laqow
2023-06-02 12:46:52 +08:00
会不会算法其实有问题?至少 python 原生的文件 IO 和字符串处理慢的一匹,直接把所有文字 read 进内存再处理,或者以二进制读取后在 byte 对象上搜索都能快出个十倍来
iX8NEGGn
2023-06-02 14:13:32 +08:00
半小时三万多字,算法肯定有问题。百万字算法合适的话也,词频统计也就几十秒

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/945072

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX