|
本帖最后由 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产生的队列,如帮助文档所说,应该不存在这个问题。
代码片段如下:
- <div class="blockcode"><blockquote>from multiprocessing import Process, Pool, Queue, Manager
- def worker(project_name, q):
- ...#拼接req
- response = urllib.request.urlopen(req)#网络IO取数据
- ...
- data = q.get()#data是统计数据的结果
- ...#IO数据写入文件
- q.put(data)#统计后更新后数据放入队列中
- def main():
- ...
- manager = Manager()
- p = Pool(processes = 8)
- q = manager.Queue(maxsize = 1)
- q.put(data)#统计信息放入队列中
- with open('data\\projects.txt', 'r') as projects:#项目名称
- for project in projects.readlines():
- ...#项目名判断是否满足要求
- p.apply_async(worker, args = (project, q))
-
- p.close()
- p.join()
- ...
- if __name__ == '__main__':
- main()
复制代码
补充一些信息:
- 其中有三个项目缺陷较多,导出的文件较大(18~38MB),手动去除这三个项目后,脚本运行没有卡死。
- 单独导出这三个项目时,有两个项目可以正确导出,但是第三个项目执行到data = q.get()后并没有把data放入队列中,若设置block timeout参数后会超时。
|
|