千家信息网

Java循环内的回调函数问题怎么解决

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容介绍了"Java循环内的回调函数问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问
千家信息网最后更新 2025年02月01日Java循环内的回调函数问题怎么解决

本篇内容介绍了"Java循环内的回调函数问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

问题出现在循环体内的回调函数,用一个很简单的例子举例:

  for x in xrange(3):

1.

  print "requests begin:%s"%x

2.

  def callback(respon):

3.

  print x

4.

  print respon.body

5.

  client.fetch("http://httpbin.org/get?x=%s" % x, callback)


  此例子忽略了等待回调函数完成的wait实现(不实现这个会导致作为单个文件运行的时候,还没获得结果就退出了),在tornado.testing中的AsyncTestCase提供了相关功能
  httpbin.org/get这个地址的作用是返回了请求的json对象,形如:
  {

1.

  "args": {

2.

  "x": "0"

3.

  },

4.

  "headers": {

5.

  "Accept-Encoding": "gzip",

6.

  "Connection": "close",

7.

  "Host": "httpbin.org",

8.

  "X-Request-Id": "95df3c15-7ed0-4a6d-830d-fb9629e66515"

9.

  },

10.

  "origin": "192.81.129.91",

11.

  "url": "http://httpbin.org/get?x=0"

12.

  }


  但实际上,由于回调函数特殊的特性:访问闭包内局部变量的当前值。易知,在第一个请求
  http://httpbin.org/get?x=0的url返回时,循环早已结束,此时的x已经为2,因此实际上虽然httpbin.org返回的json告诉我们,get参数里的x为0,但闭包内访问到的x已经是2了
  解决方法我想了两个,一个是利用回调函数构造时的变量空间,在构造函数时即产生这个参数,形如:
  client = AsyncHTTPClient(self.io_loop)

1.

  for x in xrange(3):

2.

  def callback(respon,num=x):

3.

  print x, num

4.

  print respon.body

5.

  if num == 2:

6.

  self.stop()

7.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))


  一种是再包一层闭包(这层闭包也可以放在for外面):
  client = AsyncHTTPClient(self.io_loop)

1.

  for x in xrange(3):

2.

  def wrap(number):

3.

  num = number

4.

  def callback(respon):

5.

  print x, num

6.

  print respon.body

7.

  if num == 2:

8.

  self.stop()

9.

  return callback

10.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))

11.

  #wrap放在for外面:

12.

  client = AsyncHTTPClient(self.io_loop)

13.

  def wrap(number):

14.

  num = number

15.

  def callback(respon):

16.

  print x, num

17.

  print respon.body

18.

  if num == 2:

19.

  self.stop()

20.

  return callback

21.

  for x in xrange(3):

22.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))


  思索了一下,闭包的内存占用问题应当是不可避免的?当循环体的每一项(x)是一个大内存对象时,内存占用等同于不用迭代器用列表进行循环,除了这两种不知道还有没有更优雅的解决方案。

"Java循环内的回调函数问题怎么解决"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

函数 循环 闭包 问题 实际 例子 内存 内容 参数 变量 实际上 对象 循环体 更多 知识 实用 特殊 优雅 不可避免 学有所成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 淘宝服务器证书 我的世界可以赚货币的服务器 数据库查询文本框内容并复制 数据库技术基础试卷 本周互联网科技股 手机端如何访问服务器资源 广州运维管理软件开发中心 重庆在线医疗健康软件开发 软件开发人员个人成长汇报 网络安全审计推荐机构 数据库安全组英文 数据库安全的三个基本要求 企业工程技术人员常用的数据库 德惠先进网络技术服务哪家好 数据库修改列名alter 德州诚信积分管理软件开发 刺客信条3服务器停止工作 南宫软件开发设计方案 雷神网络技术有限公司 创魔181服务器温凉访云 数据库创建用户登录界面 免费的网络安全知识竞赛题库 北辰招聘网络技术支持 服务器rac 游戏数据库管理员待遇 数据库如何存储当前时间 网络安全攻防战黑客 北京网络安全大会警察杯 大学生网络文明与网络安全简报 下列属于网络安全设备的是
0