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


    个人是小白,没有学习之前,我的想法是这样的:

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

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

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

    然后自己一通瞎写,      结果第一种方法pycharm中执行起来还行,但是打包出来的话,在windows上执行会出问题;接着试第二种方法,pycharm中执行起来还行,但是打包出来的话,执行会出问题;接着试第三种方法,pycharm中执行起来还行,但是打包出来的话,执行会出问题;

    什么问题呢?

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

    在进程中能看到,启动了很多进程,远远多于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)对象

    这都是啥意思?

    然后,然后就不知道问题出在哪里了…………

    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']

    待续…………

    我站在远处,就这样看着,一句话也不说。
  • 相关阅读:
    生成缩略图时报GDI+中发生一般性错误
    跨数据库服务器查询和跨表更新
    javascript,jquery(闭包概念)
    聚集索引和非聚集索引(整理)
    ASP.NET MVC的过滤器
    如何在标题栏title前添加网站logo?
    sql语句执行顺序
    详解ASP.NET MVC的请求生命周期
    在事务中执行批量复制操作SqlBulkCopy,SqlTransaction .
    基于TCP 协议的RPC
  • 原文地址:https://www.cnblogs.com/c-w20140301/p/11436059.html
Copyright © 2020-2023  润新知