当前位置: 首页 > 网络应用技术

Windows中的python3使用多处理。

时间:2023-03-06 20:01:58 网络应用技术

  例如:

  直接在Spyder中无反应行动;在外壳窗口中,直接报告了该错误,如下:

  Windows下面的多处理与Linux略有不同,

  多处理使用腌制的参数将MAP参数传递到不同的过程。传输函数或类时,腌制使用函数或类模块+函数/类名称。相应的函数或类将出现错误。

  当您在Internet控制台中创建功能时,该功能会动态添加到主模块中,并且在新的重新启动过程中不存在,因此会有错误。

  当不在控制台中,而是在独立的Python文件中运行时,您会遇到另一个问题:由于您调用下面的多处理代码不受保护,因此当新的进程加载此模块以创建创建新的多处理池时,将重新执行此代码,无限的电话。

  解决此问题的方法是始终将实际执行功能的代码添加到保护区域:

  补充知识:多处理池异常处理问题

  当Multiprocessing.pool开发多进程程序时,MySQL-Python在子过程执行函数中连接到数据库,

  由于编程问题,没有发现异常,这导致异常错误将其直接扔进池中,从而导致整个游泳池悬挂。

  基于上述问题,分析了多处理的源代码实现。池和python-mysql-connector以找到特定的错误原因。解决方案实际上非常简单,不要让异常投入池中。

  Centos7.3版本2.7.5的Python版本或最新的Python-2.7.14

  MySQL连接库,该版本为2.0或更高,您可以从官方网站下载最新版本:MySQL-Connector

  该问题的代码实际上可以简化为以下内容:

  因此,解决问题很简单,只需在func中添加一个尝试。

  多处理

  通过查看源代码,process.pool的实现大致如下图所示:

  当我们执行以下语句时,主进程将创建三个子线程:_handle_workers,_handle_results,_handle_tasks;同时,池(n)的数量更多。主要过程与各个工人子过程之间的通信使用了队列的内部定义,这实际上是管道管道通信,如上图所示,_taskqueue,_inqueue,_inqueue,_inqueue,和_outqueue。

  这三个子线程的作用是:

  当我们调用p.apply_async或p.map时,它实际上是创建差异或mapResult对象的,然后将任务放入_taskqueue中;调用*result.get()方法,并等待Worker sub -process.essence执行任务过程

  在了解了MultProcess.pool实施的逻辑之后,现在我们开始探索,当Func会抛出异常时,如何处理Pool的工作人员。过程。

  可以从代码中可以看出,当执行弹药时,如果弹出弹药不例外,则工人将直接将异常对象直接放入_outqueue中,然后等待下一个任务。换句话说,工人可以处理异常情况。

  然后看一下_handle_result线程如何由Worker的结果处理。如下:

  以上代码是_handle_result的主要处理逻辑。可以看出,它仅处理ioError和eoferror,也就是说,如果在get()中发生其他异常错误,它将导致_handle_result直接退出(并且确实是真的)。没有动作触发_cache中的释放信号的量,用户的执行过程一直处于等待状态。这样,用户的过程将始终粘在get()中,从而导致主流过程无法执行。

  我们打开了多处理库的日志(log_to_stderr(level = loggging.debug)),然后在multiprocessing.pool中修改了_handel_result的代码。pool,添加例外,然后运行本文开始的异常代码。

  如果控制台输出“ handle_result not Catch Exceptions”。这表明_handle_results并未对所有异常捕获。

  因此,_outqueue.get()do。在-depth中查看源代码,我发现get()方法实际上是os.pipe的读/写方法,但是完成了。内部实现大致是以下内容:

  _multiprocessing.connection使用内部使用中C的实现,并且它将不再加深,否则它将变得越来越复杂。它应该在其中使用泡菜库。放置时,对象实例腌制(即,序列化),然后在获取时重新生成实例对象。对于详细信息,您可以查看Python关于Pickle的官方文档的介绍(包括对象泡菜的条件和该方法,以及该方法当您在untactle等打电话等时打电话。无论如何,该实例是在get中,即,未分类的过程是错误的。

  'msg':self.msg.encode('utf8')如果py2 else self.msg attributerror:'int'object not totribute'

  可以从上述错误日志中可以看出,重新构造时将MSG参数引入int类型变量。也就是说,在undickle阶段中,当mySQL错误重新实现时,执行init()方法,但这是错误的,但是这是错误的,但这是错误的,但这是错误的。要验证这种现象,我简化了mysql error的init(),并最终确认为self.args的分配,也就是说,异常及其子类调用init()out the init()方法,并使用self.args用作参数列表。被传递给init()。

  通过以下代码,您可以简单地验证问题:

  日志将打印味精:aa,errno:bb在呼叫rv时,表明self.args在recv异常异常时将self.args传递到init()函数中。mySQL错误类重写self.args变量和顺序是错误的,导致MSG在执行编码时犯错。MySQL错误的实现被简化为如下:

  可以看出,mySQL错误中的自我。.args是,简单地检查了。它在异常类中定义。通常,通常使用STR或REPR方法的输出。

  好吧,经过这么多的说法,通过跟踪问题,我们基本上了解了多处理的实现。池库。我希望在使用多处理库时,它与管道特别相关,并谨慎使用。对于异常类别,请确保self.args的顺序与init()的顺序一致。似乎在Internet上使用多处理和子过程库存在问题。也许这也是一个异常提出的问题。毕竟,supocesserror的定义似乎与例外不同。