V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hannhuan
V2EX  ›  Python

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

  •  
  •   hannhuan · 2018-12-11 19:05:58 +08:00 · 2064 次点击
    这是一个创建于 1934 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,

    简化下需要添加 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 里面的东西单独拉出来是吗?(:з」∠)

    6 条回复    2018-12-12 18:38:02 +08:00
    hannhuan
        1
    hannhuan  
    OP
       2018-12-11 19:06:42 +08:00
    Σ(⊙▽⊙"a 第一次发帖有点紧张,我先研究下怎么贴代码
    nitro123
        2
    nitro123  
       2018-12-11 21:18:50 +08:00   ❤️ 1
    改用 ProcessPoolExecutor 吧,方便好用,这样可以异步,不会瞬间同时请求太多,然后挂了,这是我理解😂
    fngtz
        3
    fngtz  
       2018-12-12 04:21:35 +08:00 via iPhone   ❤️ 1
    说句题外话,I/O 瓶颈应该用 thread 或者 conroutine 解决哎。
    cgsv
        4
    cgsv  
       2018-12-12 15:37:39 +08:00   ❤️ 1
    给个建议吧,在 Python 里面想并行化,较为方便的一种做法是把循环改成 map,然后 map 的实现可以用多进程、多线程或者 gevent 里面的 map 实现,这样只需修改一个位置就能用不同的并发模型
    hannhuan
        5
    hannhuan  
    OP
       2018-12-12 18:37:45 +08:00
    _(:з」∠)_谢谢各种建议,已经找男朋友搞定啦。最后只是把 for 循环里的东西拿出来单独弄了个 function,然后用了 pool.map 。
    hannhuan
        6
    hannhuan  
    OP
       2018-12-12 18:38:02 +08:00
    @cgsv 嗯嗯,最后的确用的是这个方法。感谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5373 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 07:34 · PVG 15:34 · LAX 00:34 · JFK 03:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.