记一次多进程的写入同一个文件的方法

我的是小白,没有学习以前,个人想法是这样的:数据库

第一种办法,就是设置一个全局变量write_flag,当一个进程将结果写入时,首先看看write_flag是否为True,若是为True,而后将write_flag重置为Flase,而后将结果写入文件,而后将write_flag重置为True;windows

第二种办法,使用Lock锁,写以前先lock.acquire(),写完后lock.release();app

第三种办法,使用回调函数,callback表示一个单参数的方法,当有结果返回时,callback方法会被调用,参数即为任务执行后的结果函数

而后本身一通瞎写,      结果第一种方法pycharm中执行起来还行,可是打包出来的话,在windows上执行会出问题;接着试第二种方法,pycharm中执行起来还行,可是打包出来的话,执行会出问题;接着试第三种方法,pycharm中执行起来还行,可是打包出来的话,执行会出问题;学习

什么问题呢?ui

运行exe,启动无数个主程序,致使系统没法使用!!!!spa

在进程中能看到,启动了不少进程,远远多于pool中设置的processes数,什么缘由呢?明明资料中介绍的是;调试

Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None)
    Returns a process pool object
processes表示工做进程的个数,默认为None,表示worker进程数为cpu_count()
initializer表示工做进程start时调用的初始化函数,initargs表示initializer函数的参数,若是initializer不为None,在每一个工做进程start以前会调用initializer(*initargs)
maxtaskperchild表示每一个工做进程在退出/被其余新的进程替代前,须要完成的工做任务数,默认为None,表示工做进程存活时间与pool相同,即不会自动退出/被替换。
函数返回一个进程池(Pool)对象

这都是啥意思?code

而后,而后就不知道问题出在哪里了…………对象

 

 

 

 

 

1.问题描述:运行exe,启动无数个主程序,致使系统没法使用

    缘由:在程序中使用了multiprocessing的包

    解决办法:在主文件if __name__ == "__main__":后,添加multiprocessing.freeze_support(),必定要在添加在最开始处

2. 问题描述:运行后,提示在freeze_support中sys.stdout.flush处异常

   缘由:使用的PyQT做为界面,没有控制台

   解决办法:在调用multiprocessing.freeze_support()前,重定向stdout和stderr,添加:sys.stdout = io.StringIO()和 sys.stderr = io.StringIO()

3.使用shelve模块,IDE下调试能够正常使用,打包后没法使用

    缘由:shelve 的 open 函数在运行中还会装入其它的数据库管理模块,无从了解还须要哪些额外的包,故在打包时就漏掉了一些必要的模块

 

解决办法:修改打包脚本,添加以下内容:

packages = []
for dbmodule in ['dbhash', 'gdbm', 'dbm', 'dumbdbm']:
try:
__import__(dbmodule)
except ImportError:
pass
else:
# If we found the module, ensure it's copied to the build directory.
packages.append(dbmodule)
options = {
'build_exe': {
'includes': 'atexit',
"packages": packages
}
}

 

4.使用inspect.getsourcelines异常OSError: could not get source code

  缘由:打包后,都是pyc文件,没有源代码,致使动态获取代码失败

  解决办法:将包含所需源码的py文件打包到library.zip文件中,在‘build_exe'参数中,增长'zip_includes':['path\\source.py']

 

 

 

待续…………

相关文章
相关标签/搜索