用python做服务器,如何实现异步的延迟调用函数

qq_26138039 2015-02-23 03:18:53
学习python没多久,之前也没有太多编程的经验。我就具体描述一下我面临的具体问题和希望实现的效果,请大家给点建议。如果觉得我的问题描述的不清楚,也请回帖指出,谢谢。

我用django框架来做服务器完成一些逻辑,现在有这样一个问题需要解决:
我自己的服务器为A,需要与另外一个第三方的服务器B互相发送一些HTTP的请求,完成一些逻辑。流程如下:
1、首先是服务器B向我的服务器A发起了一个请求X,
2、然后我的服务器A对这个请求X进行处理,
3、我的服务器A处理完成后,给第三方服务器B发送一个HTTP处理的返回数据。另外需要在延迟10秒钟后,主动向服务器B再发起一个请求Y。向服务器B确认一下刚才的请求X的处理结果是否已经收到了。

我的问题就在于加粗部分的功能不会做了。

因为我的服务器A会收到很多的请求,有来自服务器B的请求,还有很多其他客户端的请求。按照我的理解,每次收到一个请求,服务器就需要启动一个线程来对这个请求进行处理,当前的请求处理完成后,线程就可以接下来处理其他的请求。如果我这里延迟10秒钟再发起请求,那么这个线程就会一直阻塞,无法处理别的请求。影响服务器的性能。

我想要的解决办法是当收到请求X后,执行完处理逻辑,给服务器B发送返回的数据后,这个线程就结束了。可以继续处理别的请求了。而10秒钟延迟后主动发起请求的功能,不要一直阻塞这个线程的执行。

我大概的想法是,写一个新的类,这个类有一个方法DELAYCALL,可以启动一个计时器,然后计时器计时10秒钟后,触发一个事件,在这个事件的处理函数中主动给服务器B发送请求Y。

这样我在写处理服务器B的请求X的代码时,最后执行一下这个类的DELAYCALL方法,然后就给服务器B返回请求的数据。这样这个线程就结束了。而延迟10秒后,会通过触发事件来完成主动发送请求的功能。

我不知道我自己这么想对不对,能不能达到想要的效果。如果不行,请大家帮忙指点一下该如何来解决这个问题。
...全文
626 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nieoding 2015-02-25
  • 打赏
  • 举报
回复
简单的做法是用Thread去调度,由于实际部署django应该是配合uwsgi多进程工作,你可以不用关心线程什么时候消亡,只有线程代码不是死循环,不会影响后面的web请求的。 高富帅的做法就是使用celery,可以参考http://www.tuicool.com/articles/jaaumy,基本原理是后台有一个celery进程,django只是通知celery去delaycall一个指令。
黑泡泡选手 2015-02-25
  • 打赏
  • 举报
回复
看 一下 celery
panghuhu250 2015-02-23
  • 打赏
  • 举报
回复
引用 1 楼 qq_26138039 的回复:
我想再问一下,如果用这样的方法,等于就是新创建了一个线程,然后来执行delaycall,而原来的线程就继续向下执行程序了对吧?
引用 1 楼 qq_26138039 的回复:
这个新创建的线程在什么时候会结束呢?是不是delaycall函数执行完,这个线程就结束了?
对. 自己写点代码测试一下就知道了. 另外, 为什么不在B给A的第一个http请求的回复中放上需要返回的数据呢? B如果没有收到回复, 应该再发送请求, 否则, 就是收到结果了. (没有坏消息就是好消息) 或者A向B发http请求发送结果时时, B也会给A一个回复, 为什么还需要10秒钟后再确认呢? (不了解你的应用细节, 以上建议只供参考)
qq_26138039 2015-02-23
  • 打赏
  • 举报
回复
百度了一个下午 发现了一个解决办法 采用threading.timer(10,delaycall)就可以实现直接返回数据,然后延迟10秒后,调用delaycall来进行新的请求发起。 我想再问一下,如果用这样的方法,等于就是新创建了一个线程,然后来执行delaycall,而原来的线程就继续向下执行程序了对吧? 这个新创建的线程在什么时候会结束呢?是不是delaycall函数执行完,这个线程就结束了?

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧