python:join及其在manager中的问题分析

  在学习python多进程管理manager时候,当不使用join对当前进程(主进程)进行阻塞时会报错,具体代码及错误如下:

from multiprocessing import Process, Manager
import time
import os

def info(title):
    print(title)
    print(‘module name:‘, __name__)
    print(‘parent process:‘, os.getppid())
    print(‘process id:‘, os.getpid())
    print("\n\n")

def f(d, l,n):
    info(‘\033[32;1m subprocess line\033[0m‘)
    d[1] = ‘1‘
    d[‘2‘] = 2
    d[0.25] = None
    l.append(n)
    print(l)

if __name__ == ‘__main__‘:
    info(‘\033[32;1mmain process line\033[0m‘)
    with Manager() as manager:
        d = manager.dict()

        l = manager.list(range(5))
        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l,i))
            p_list.append(p)
            # p.join()
        for p in p_list:
            p.start()
            # time.sleep(1)
        # time.sleep(1)

for res in p_list:    res.start()    res.join()

报错:

Process Process-11:
Traceback (most recent call last):
  File "/usr/lib/python3.4/multiprocessing/managers.py", line 724, in _callmethod
    conn = self._tls.connection
AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.4/multiprocessing/process.py", line 254, in _bootstrap
    self.run()
  File "/usr/lib/python3.4/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "managerTest.py", line 19, in f
    d[1] = ‘1‘
  File "<string>", line 2, in __setitem__
  File "/usr/lib/python3.4/multiprocessing/managers.py", line 728, in _callmethod
    self._connect()
  File "/usr/lib/python3.4/multiprocessing/managers.py", line 715, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/usr/lib/python3.4/multiprocessing/connection.py", line 495, in Client
    c = SocketClient(address)
  File "/usr/lib/python3.4/multiprocessing/connection.py", line 624, in SocketClient
    s.connect(address)
FileNotFoundError: [Errno 2] No such file or directory

  关于代码部分,不做过多解释了就。在manager后对进程进行join后,问题消失,程序正常运行。从错误信息上看不出什么具体的原因,只是说当处理一个exception时候出现另一个异常......因为join函数官方文档的意思是:阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程。所以定位问题的原因可能:

  1. 因为多个进程是共享数据(l,d),可能是因为多进程对数据进行修改时冲突-------但manager就是干这事的,所以基本可以排除。
  2. 因为当多哥进程运行时,主进程已经结束,所以报这个错误------为了测试这个问题,我在主进程末尾sleep了一下,但问题没有解决
  3. 因为manager内部原因,在manager管理进程的同时不可以进入主进程进行某些交互,无论主进程结束与否,进去主进程就是不行的-------我在manager内sleep了一下,程序正常运行了。-------具体的等有时间可以分析一下manager的源代码

  这样进行一下总结:在使用manager管理/进行多进程及其数据交互时候,必须对每一个manager内的进程进行join-------待所有子进程完成后再回到主进程。

  由于没有查看源代码进行研究,所以此结论如果不是此问题root cause 或者大家有什么想法,欢迎交流,感谢指正。

时间: 2024-10-25 19:58:18

python:join及其在manager中的问题分析的相关文章

Python join()方法

描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence) 参数 sequence -- 要连接的元素序列. 返回值 返回通过指定字符连接序列中元素后生成的新字符串. 实例 以下实例展示了join()的使用方法: #!/usr/bin/python str = "-"; seq = ("a", "b", "c"); # 字符串

Python join() 方法与os.path.join()的区别

Python join() 方法与os.path.join()的区别 1. 函数作用: join() :将序列.字符串 .元组等中的元素以指定的字符连接生成一个新的字符串.os.path.join() : 将多个路径组合后返回 2. join()方法说明: join()方法语法:str.join(sequence)参数说明:str:指定的字符,即分隔符sequence:需要连接的元素 #字符串序列 seq = ("apple", "banana", "pe

Python 提取新浪微博的博文中的元素(包含Text, Screen_name)

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-8 @author: guaguastd @name: extractWeiboEntities.py ''' if __name__ == '__main__': import json # get weibo_api to access sina api from sinaWeiboLogin import sinaWeiboLogin sinaWeib

left join on 和where中条件的放置位置

转自:http://blog.csdn.net/muxiaoshan/article/details/7617533 select * from td  left join (select case_id as sup_case_id , count(*) supervise_number from  td_kcdc_case_sup_info  group by  case_id  ) sup on     sup.sup_case_id = td.case_id where 1=1   /*

XE6发布文件 在Deployment Manager中添加待发布的文件,Remote Path写入assets\internal\或assets\就可以

XE6发布文件 在Deployment Manager中添加待发布的文件,Remote Path写入assets\internal\或assets\就可以其中assets\internal\会把文件发布到TPath.GetDocumentsPath(也就是/data/data/.../files)目录下assets\会把文件发布到TPath.GetSharedDocumentsPath(也就是/mnt/sdcard/Android/data/.../files)目录下另外修改了System.St

Python在自动化运维中的应用

欢迎加入Reboot运维开发千人群(365534424) 技术交流分享天天有 我更喜欢用"系统平台管理"来形容"运维"这项工作.注意系统.平台这两个词语.运维听起来是偏执行的一项工作.python在系统管理上的优势在与强大的开发能力和完整的工具链.python的工程开发能力强大,远强于各种shell和perl.易读易写,兼具面向对象和函数式风格,还有不错元编程能力.通过系统化的将各种管理工具结合,对上述的各类工具进行二次开发,形成统一的服务器管理系统. 和pytho

解决在sdk manager中更新文件后出现This Android SDK requires Android Developer Toolkit version 23.1的错误

起因:在sdksdk manager中更新了adt及其他的支持库后,eclipse报错:This Android SDK requires Android Developer Toolkit version 23.1的错误.可是sdksdk manager中明明显示23.1的adt是已经installed的了呀,这就奇怪了.. 解决办法:Help -> Install New Software -> Add ->http://dl-ssl.google.com/android/eclip

Python语言在人工智能(AI)中的优势 (转)

本文探讨了Python语言在AI领域的优势与运用. 谁会成为AI 和大数据时代的第一开发语言? 这本已是一个不需要争论的问题.如果说三年前,Matlab.Scala.R.Java 和 python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明确了,特别是前两天 Facebook 开源了 PyTorch 之后,Python 作为 AI 时代头牌语言的位置基本确立,未来的悬念仅仅是谁能坐稳第二把交椅. 不过声音市场上还有一些杂音.最近一个有意学习数据科学的姑娘跟我说,她的一个朋友建议她从

关于在left join的on子句中限制左边表的取值时出现非期望的结果

使用的SQL大概是这样的: select * from A left join B on A.id=B.id and A.id>10; --错误的使用 我们期望的结果集应该是 A中的id>10,但是实际上A.id>10 这个限制条件并没有起作用. 应该改成如下的这种形式: select * from A left join B on A.id=B.id where A.id>10;--正确的使用 这是在oracle的官方文档中找到的相关说明: left outer joinThe