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
2225377fjs
V2EX  ›  Python

关于 Python 并行多线程

  •  
  •   2225377fjs · 2017-02-07 10:28:50 +08:00 · 3905 次点击
    这是一个创建于 2844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知论坛里面是否有 python 大神,现在想要实现这样的需求。。

    整个进程就两个线程,一个用于处理 IO ,一个用于处理逻辑请求。。。

    两个部分是 python 来实现,例如 IO 层采用 gevent 啥的。。。

    两个线程需要并行的,两层之间的数据交互通过队列来做,不知这样能否实现。。?

    也就是所想要在一个进程中启动两个 python 实例,两个并行的线程来分别运行这两个实例来处理不同的逻辑。

    9 条回复    2017-02-08 03:43:25 +08:00
    kingmo888
        1
    kingmo888  
       2017-02-07 11:00:43 +08:00
    为何要用 2 个实例呢?

    弄个事件引擎哈(其实还是队列。)
    2225377fjs
        2
    2225377fjs  
    OP
       2017-02-07 11:08:46 +08:00
    @kingmo888 这样是为了尽量提升单个进程的处理能力,所以想到了用两个并行的线程,一个线程用于处理 IO 以及数据包相关的事情,现在其实就是这样子的,只不过 IO 层用的是 C++的,但是考虑到要替换上层的实现,例如 pypy 的时候,就比较麻烦了,例如 binding 差异比较大。。
    thomaspaine
        3
    thomaspaine  
       2017-02-07 11:19:34 +08:00
    生产消费模型?用 celery 试试呗
    enenaaa
        4
    enenaaa  
       2017-02-07 11:25:21 +08:00
    因为 gil 的存在, python 在同一时间点只能执行一个线程,与我们通常理解的线程概念不同。
    但你有个线程是专门做 io 的, 所以也问题不大了。
    zhtsuc
        5
    zhtsuc  
       2017-02-07 11:33:26 +08:00
    eventbus 即可。
    tankeco
        6
    tankeco  
       2017-02-07 13:43:33 +08:00
    两个进程行吗...随手糙一个...

    from multiprocessing import Queue, Process

    def io_worker(q):
    data =gao1()
    q.put(data)

    def logic_worker(q):
    data = q.get()
    gao2(data)

    def main():
    q = Queue()
    p1 = Process(io_worker, args=(q, ))
    p2 = Process(logic_worker, args=(q, ))
    billowqiu
        7
    billowqiu  
       2017-02-07 13:46:46 +08:00
    rim99
        8
    rim99  
       2017-02-07 22:30:24 +08:00
    这是 multiprocessing 的基础 API 就能实现的啊,多看看文档吧
    NoAnyLove
        9
    NoAnyLove  
       2017-02-08 03:43:25 +08:00
    没有看出有啥问题啊, threading 或者 multiprocessing 都能实现。有点不太理解楼主对并行线程的的定义是啥。。。。。虽然有 gil ,但是在 IO 和逻辑分别用不同线程处理的时候也没啥问题啊。

    而且其实做成单线程也不会有大问题, Linux 下可以用 select ,或者 asyncio 来做都行。 Windows 下要麻烦一点, select 只支持 socket ,异步的 IO 可能需要自己用 Win32 API 封装吧,不过 asyncio 有说自己是用的 IOCP ,理论上可以处理异步 IO ,只是 asyncio 文档好复杂,反正我还么学懂

    此外, gevent 之类的库也是支持的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:53 · PVG 06:53 · LAX 14:53 · JFK 17:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.