各方面的菜鸟问个关于 Python multiprocess 的问题

2018-12-11 19:05:58 +08:00
 hannhuan

大家好,

简化下需要添加 multiprocess 的一段代码如下:

def formatter(a_response):
    response = {}
    # 问题 1:我想在这里加一个 pool?
    for index, value in enumerate(value):
    	# value = 对 value 进行一些处理
    	response[index] = value # 这里用 dict 而不是 list 是为了日后读取时更快,O(1) vs O(n)
    return response
    
def a_http_post(a_string):
    # a requests.post
    return r.text

def do_sth():
    a_dictionary = pickle.load(my_file)
    # 问题 2:我想在这里用 multiprocess 的 manager ?
    for k, v_list in a_dictionary.items():
    	for v in v_list:
    		response = a_http_post(v)
            a_dictionary[k] = formatter(response)
    return a_dictionary
    
if __name__ == "__main__":
    # ...
    res = do_sth()
    # ...

我想请教下问题 1 和问题 2 里,我 Pool 跟 manager 用的是否正确?或者是整体结构有没有什么不妥需要修改的地方?_(:з」∠)_提前谢谢大佬们~

如果要用 Pool 跟 Manager,我应该必须把 for loop 里面的东西单独拉出来是吗?(:з」∠)

2093 次点击
所在节点    Python
6 条回复
hannhuan
2018-12-11 19:06:42 +08:00
Σ(⊙▽⊙"a 第一次发帖有点紧张,我先研究下怎么贴代码
nitro123
2018-12-11 21:18:50 +08:00
改用 ProcessPoolExecutor 吧,方便好用,这样可以异步,不会瞬间同时请求太多,然后挂了,这是我理解😂
fngtz
2018-12-12 04:21:35 +08:00
说句题外话,I/O 瓶颈应该用 thread 或者 conroutine 解决哎。
cgsv
2018-12-12 15:37:39 +08:00
给个建议吧,在 Python 里面想并行化,较为方便的一种做法是把循环改成 map,然后 map 的实现可以用多进程、多线程或者 gevent 里面的 map 实现,这样只需修改一个位置就能用不同的并发模型
hannhuan
2018-12-12 18:37:45 +08:00
_(:з」∠)_谢谢各种建议,已经找男朋友搞定啦。最后只是把 for 循环里的东西拿出来单独弄了个 function,然后用了 pool.map 。
hannhuan
2018-12-12 18:38:02 +08:00
@cgsv 嗯嗯,最后的确用的是这个方法。感谢~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516624

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX