51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 387|回复: 0
打印 上一主题 下一主题

[资料] Java、Python、JavaScript和Go中拥抱异步是如何做到的?

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 947 天

    连续签到: 6 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-6-19 14:44:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    作为一名拥有多年Java经验的软件开发人员,当我最近切换到Python进行一个新项目时,我发现自己很感兴趣。这种转变促使我探索各种语言的异步编程世界,包括Java,Python,JavaScript和Golang。本文是我对这些语言的探索和个人经验的结果,旨在提供对异步编程技术和示例的见解。
      1、Java中的异步编程
      当我第一次开始用Java编程时,我很快就熟悉了线程的概念。随着时间的推移,我发现Executor框架和CompletableFuture类提供了更强大、更灵活的方法来处理异步操作。
      例如,我使用Executor框架构建了一个网络抓取工具,可以同时从多个网站获取数据。通过使用固定线程池,我能够限制同时连接的数量,同时有效地管理资源:
      ExecutorService executor = Executors.newFixedThreadPool(10);
      for (String url : urls) {
          executor.submit(() -> {
              // Fetch data from the URL and process it
          });
      }
      executor.shutdown();
      executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);


      2、Python中的异步编程
      切换到Python后,我最初受到异步编程的不同方法的挑战。但是,在了解了asyncio库和async/await语法后,我发现它是一个强大而优雅的解决方案。
      我曾经实现过一个基于Python的微服务,需要进行多次API调用。通过利用asyncio和async/await,我能够并发执行这些调用,并显著缩短整体响应时间:
      import aiohttp
      import asyncio
      async def fetch(url):
          async with aiohttp.ClientSession() as session:
              async with session.get(url) as response:
                  return await response.text()
      async def main():
          urls = [...]  # List of URLs
          tasks = [fetch(url) for url in urls]
          responses = await asyncio.gather(*tasks)
      asyncio.run(main())


      3、JavaScript中的异步编程
      在使用JavaScript时,我很欣赏它对异步编程的固有支持。因此,我在各种Web应用程序中广泛使用了回调、承诺和异步/等待。
      例如,我曾经构建过一个Node.js应用程序,该应用程序需要来自多个RESTful API 的数据。通过使用promise和async/await,我能够简化代码并更优雅地处理错误:
      const axios = require("axios");
      async function fetchData(urls) {
          const promises = urls.map(url => axios.get(url));
          const results = await Promise.all(promises);
          // Process the results
      }
      const urls = [...]  // List of URLs
      fetchData(urls);


      4、Golang中的异步编程
      在我探索Golang的过程中,我对它对并发和异步编程的原生支持着迷,这要归功于goroutines和channels。
      例如,在处理一个需要实时处理来自多个来源的数据的项目时,我利用goroutines和通道来有效地管理资源并同步数据流:
      package main
      import (
          "fmt"
          "net/http"
          "io/ioutil"
      )
      func processSource(url string, ch chan<- string) {
          resp, err := http.Get(url)
          if err != nil {
              ch <- fmt.Sprintf("Error fetching data from %s: %v", url, err)
              return
          }
          defer resp.Body.Close()
          body, err := ioutil.ReadAll(resp.Body)
          // Process the fetched data
          ch <- fmt.Sprintf("Processed data from %s", url)
      }
      func main() {
          sources := [...]  // List of data sources
          ch := make(chan string, len(sources))
          for _, url := range sources {
              go processSource(url, ch)
          }
          for range sources {
              fmt.Println(<-ch)
          }
      }


      5、结论
      异步编程是现代应用程序开发的一个重要方面,深入了解其跨各种语言的实现是非常宝贵的。我在Java、Python、JavaScript和Golang方面的经验告诉我,每种语言都有其独特而强大的功能来管理异步任务。通过分享这些经验和示例,我的目标是鼓励其他人在他们的项目中采用异步性,最终成就更高效和响应更快的应用程序。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-14 02:07 , Processed in 0.065142 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表