大家好,
简化下需要添加 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 里面的东西单独拉出来是吗?(:з」∠)
1
hannhuan OP Σ(⊙▽⊙"a 第一次发帖有点紧张,我先研究下怎么贴代码
|
2
nitro123 2018-12-11 21:18:50 +08:00 1
改用 ProcessPoolExecutor 吧,方便好用,这样可以异步,不会瞬间同时请求太多,然后挂了,这是我理解😂
|
3
fngtz 2018-12-12 04:21:35 +08:00 via iPhone 1
说句题外话,I/O 瓶颈应该用 thread 或者 conroutine 解决哎。
|
4
cgsv 2018-12-12 15:37:39 +08:00 1
给个建议吧,在 Python 里面想并行化,较为方便的一种做法是把循环改成 map,然后 map 的实现可以用多进程、多线程或者 gevent 里面的 map 实现,这样只需修改一个位置就能用不同的并发模型
|
5
hannhuan OP _(:з」∠)_谢谢各种建议,已经找男朋友搞定啦。最后只是把 for 循环里的东西拿出来单独弄了个 function,然后用了 pool.map 。
|