如何在Java、Python、JavaScript和Go中拥抱异步

译文 精选
开发 前端
异步编程是现代应用程序开发的一个重要方面,深入了解其跨各种语言的实现是非常宝贵的。我在Java、Python、JavaScript和Golang方面的经验告诉我,每种语言都有其独特而强大的功能来管理异步任务。

点击参加51CTO网站内容调查问卷

作者丨Andrei Tetka

策划丨千山

作为一名拥有多年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方面的经验告诉我,每种语言都有其独特而强大的功能来管理异步任务。通过分享这些经验和示例,我的目标是鼓励其他人在他们的项目中采用异步性,最终成就更高效和响应更快的应用程序。

原文链接:https://dzone.com/articles/embracing-asynchrony-in-java-python-javascript-and

责任编辑:武晓燕 来源: 51CTO技术栈
相关推荐

2021-07-09 12:37:31

GoPython编程语言

2021-03-18 10:45:02

JavaScript数组运算符

2021-03-11 23:43:20

JavaScript数组开发

2024-10-22 15:10:49

2022-01-21 10:58:39

JavaScriptGolangPython

2023-07-26 15:52:05

2011-03-21 12:41:41

JavaScript

2015-08-17 11:20:40

开源工具

2023-11-26 19:06:13

GO测试

2018-10-11 09:40:53

前端JavaScript编程语言

2022-03-15 07:55:09

JavaScript线性仪表图开发

2023-06-27 09:00:00

2021-11-08 10:58:08

变量依赖图排序

2022-09-19 11:42:21

Go优化CPU

2022-09-12 23:53:53

JavaScript条件判断开发

2015-07-06 09:59:56

JavaScript私有成员

2021-03-29 08:01:20

JavaScript数据结构

2022-07-07 07:22:01

浏览器JavaScript工具

2024-04-11 08:30:05

JavaScript数组函数

2020-11-26 08:12:24

JavaScript对象数组
点赞
收藏

51CTO技术栈公众号