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

2017-07-09 19:12:35 +08:00
 a251922581
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.
2046 次点击
所在节点    Python
7 条回复
a251922581
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
2017-07-10 10:27:13 +08:00
第一次遇到 Pause/Resume/Terminate 这样的需求,话说服务器构造的返回不是都要尽量快吗
Kongyuan
2017-07-10 16:37:14 +08:00
是 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
2017-07-11 21:59:24 +08:00
@ToBeHacker 因为每个函数都是要运行几分钟到几十分钟才能完成任务的,资源消耗都不大,但是运行时间比较长
a251922581
2017-07-11 22:03:50 +08:00
@Kongyuan 多谢解答,C/S 的桌面应用,Server 端接收到 Client 端请求后,后台运行这 100 个 thread/process,然后直接返回的,函数 /Class 所执行任务的结果在另外的地方会有体现,所以 Server 端要做的就是把函数扔到后台运行。
目前是直接 Flask + FlaskRestful API,还没有用到其它的 Web 框架。
cszeus
2017-07-12 05:44:18 +08:00
感觉应该用个消息队列吧。每次来个请求,把任务放进队列就可以返回了。
Kongyuan
2017-07-13 11:43:56 +08:00
@a251922581 Flask ( wsgi ) + FalskRestful API 足够解决了, 配合 APScheduler。

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

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

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

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

© 2021 V2EX