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
a251922581
V2EX  ›  Python

有执行约几分钟完成的 100 个 Class/函数,每次收到命令后要开始执行这 100 个 Class,是用 Threading 实现吗?

  •  
  •   a251922581 · 2017-07-09 19:12:35 +08:00 · 1878 次点击
    这是一个创建于 2483 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Python 初学者求教。。
    python 写的服务器端,每次收到请求命令的时候,需要执行 100 个 Class ( Class 就包含一个函数具体干活),因为请求来自不同客户,所以可能会同时有几十个请求。
    最好还能实现客户能对没执行完的那些 Class 进行 Pause/Resume/Terminate 暂停执行 /恢复执行 /终止执行
    多线程能完成这个项目需求吗?
    class serv100:
    def serv( parameter):
    print ("abc")
    .....
    class serv199:
    def serv( parameter):
    print("xyz")


    def handleClientRequest(options):
    ??????

    初学者求教,??????这边大概的代码怎么写?一开始要 import 哪些 library? Thanks in advance.
    7 条回复    2017-07-13 11:43:56 +08:00
    a251922581
        1
    a251922581  
    OP
       2017-07-09 19:40:27 +08:00
    100 個 def 的函數都做到 1 個 Class 裡是不是要好一些?
    Class server(option):
    def serv100:
    print()
    def serv101:
    print()
    ......
    def serv199:
    print()
    ToBeHacker
        2
    ToBeHacker  
       2017-07-10 10:27:13 +08:00   ❤️ 1
    第一次遇到 Pause/Resume/Terminate 这样的需求,话说服务器构造的返回不是都要尽量快吗
    Kongyuan
        3
    Kongyuan  
       2017-07-10 16:37:14 +08:00   ❤️ 1
    是 C/S 还是 B/S ?如果是 B/S, 那可以让 wsgi 来处理接收并发的客户请求。 取决于你选择什么样的 python wsgi 实现。 对应的实现会处理好不同客户不同时间发起的多个请求,每个请求相互间应该是线程 /进程独立的。(取决于你选择的 wsgi 实现)。 所以你只需要考虑再收到客户请求的时候( http get/post ) 你要如何执行那 100 个 class。 这里有两种方案:

    1. 客户请求( http get/post )进入,你采用阻塞的方式运行 100 个 class,全部运行结束返回给客户运行结果。 这期间你可以用全局变量或者别的方式控制每个阻塞进程运行的情况。 但这样无法完全实现你想要的 pasue/resume/terminate 因为一旦客户端口链接,一般 wsgi 的实现会销毁掉你正在阻塞的处理线程 /进程。
    2. 客户请求( http get/post ) 进入, 你开启非阻塞线程 /进程来跑 100 个 class, 然后立刻返回客户成功运行程序。 后台需要全局变量(或别的实现方式, 我常用类里面的静态变量和方法来代替全局变量)来控制。

    总结而言, 用成熟的 python web 框架帮你处理用户请求,再自己去选择请求内创建自己可以控制的进程或线程完成任务,维护全局信息表来索引实现你的控制。 至于 是用 threading 还是 mulitprocess 则见仁见智了。 另外推荐用 APScheduler 这个包, 分装了 Pause/Resume/Terminate。

    有不对的地方,还请指正~
    a251922581
        4
    a251922581  
    OP
       2017-07-11 21:59:24 +08:00
    @ToBeHacker 因为每个函数都是要运行几分钟到几十分钟才能完成任务的,资源消耗都不大,但是运行时间比较长
    a251922581
        5
    a251922581  
    OP
       2017-07-11 22:03:50 +08:00
    @Kongyuan 多谢解答,C/S 的桌面应用,Server 端接收到 Client 端请求后,后台运行这 100 个 thread/process,然后直接返回的,函数 /Class 所执行任务的结果在另外的地方会有体现,所以 Server 端要做的就是把函数扔到后台运行。
    目前是直接 Flask + FlaskRestful API,还没有用到其它的 Web 框架。
    cszeus
        6
    cszeus  
       2017-07-12 05:44:18 +08:00
    感觉应该用个消息队列吧。每次来个请求,把任务放进队列就可以返回了。
    Kongyuan
        7
    Kongyuan  
       2017-07-13 11:43:56 +08:00
    @a251922581 Flask ( wsgi ) + FalskRestful API 足够解决了, 配合 APScheduler。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2822 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:50 · PVG 22:50 · LAX 07:50 · JFK 10:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.