找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5346|回复: 0

[求助] python多进程死锁问题求助

1

主题

1

帖子

1

积分

贫民

积分
1
jasperwow 发表于 2017-1-5 20:18:49 | 显示全部楼层 |阅读模式
本帖最后由 jasperwow 于 2017-1-5 20:21 编辑

***************************************
服务器有500个项目的代码缺陷信息需要导出、统计并做可视化分析,想用多进程加快运行速度时,使用队列进行进程间数据共享,设置队列最大数目为1,我觉得此时不需要再考虑变量加锁的问题。
实际运行的时候发现到217个项目时,进程死锁。队列put和get加上timeout参数后,会超时。
此时,就算给队列加上锁,还是会在217个项目时,死锁。
查了python manual和stackoverflow上相关内容,还是找不到原因,想请教一下诸位!python manual中有一段说明:
This means that if you try joining that process you may get a deadlock unless you are sure that all items which have been put on the queue have been consumed. Similarly, if the child process is non-daemonic then the parent process may hang on exit when it tries to join all its non-daemonic children.
Note that a queue created using a manager does not have this issue.

但是,我使用的是manager产生的队列,如帮助文档所说,应该不存在这个问题。
代码片段如下:

  1. <div class="blockcode"><blockquote>from multiprocessing import Process, Pool, Queue, Manager
  2. def worker(project_name, q):
  3.     ...#拼接req
  4.     response = urllib.request.urlopen(req)#网络IO取数据
  5.     ...
  6.     data = q.get()#data是统计数据的结果
  7.     ...#IO数据写入文件
  8.     q.put(data)#统计后更新后数据放入队列中

  9. def main():
  10.     ...
  11.     manager = Manager()
  12.     p = Pool(processes = 8)
  13.     q = manager.Queue(maxsize = 1)
  14.     q.put(data)#统计信息放入队列中
  15.     with open('data\\projects.txt', 'r') as projects:#项目名称
  16.         for project in projects.readlines():
  17.             ...#项目名判断是否满足要求
  18.             p.apply_async(worker, args = (project, q))
  19.        
  20.     p.close()
  21.     p.join()
  22.     ...

  23. if __name__ == '__main__':
  24.     main()
复制代码



补充一些信息:
  • 其中有三个项目缺陷较多,导出的文件较大(18~38MB),手动去除这三个项目后,脚本运行没有卡死。
  • 单独导出这三个项目时,有两个项目可以正确导出,但是第三个项目执行到data = q.get()后并没有把data放入队列中,若设置block timeout参数后会超时。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表