本宝宝最近在写一个永久性运行的小工具,同时也是多任务同时运行的,最终是打包成一个exe程序。
最开始,我上来就先用了mulprocessing
主函数大概长这样的:
import multiprocessing
def GETXML():
#一个不重要的读取函数
def func():
#一个不重要的操作函数
if __name__ == '__main__':
array=GETXML('.\con.xml')
pool = multiprocessing.Pool()
#这是一贯的使用方式,array是需要的多个对象,func是对这些对象要完成的操作
#answer=pool.map(func,array)
#不阻塞进行,可以用map_async()
#需要多个可迭代对象,而map只能有一个可迭代对象,于是再换成
answer=pool.starmap_async(func,array)
#当然也能这么写
for i in array:
pool = multiprocessing.Process(target=func,args=(i,))
pool.start()
美美打包成exe
pyinstaller -F auto.py
然后一打开exe运行,各个进程都开始疯狂繁衍,本来10个进程的程序,繁衍到爆炸,无法关闭窗口,然后我的电脑直接死机了。
上网一搜,倒也有解决方法:multiprocessing打包exe后启动崩溃内存溢出解决办法_pyinstaller multiprocessing-CSDN博客
引入这个办法之后,程序倒也不崩了,但是程序一跑起来,CPU占用就超50%了。继续深根,我这边属于I/O密集型任务,应该采用多线程,而非多进程的方式。
多线程的话,可以用mulprocessing.dummy 或者Threading
前者和上面差不多,我最后用的Threading