首页 > 编程语言 >在 Java、Python、JavaScript 和 Go 中拥抱异步

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

时间:2023-06-28 15:57:25浏览次数:37  
标签:异步 编程 Java Python JavaScript url async

本文讨论了四种语言的异步,强调了它在创建高效、响应迅速的应用程序中的作用。

作为一名拥有多年主要使用 Java 工作经验的软件开发人员,当我最近为一个新项目切换到 Python 时,我发现自己很感兴趣。这种转变促使我探索各种语言的异步编程世界,包括 Java、Python、JavaScript 和 Golang。本文是我对这些语言的探索和个人经验的结果,旨在提供对异步编程技术和示例的深入了解。

 

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);

 

 

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())

 

JavaScript 中的异步编程

在使用 JavaScript 时,我很欣赏它对异步编程的内在支持。因此,我在各种 Web 应用程序中广泛使用了回调、承诺和异步/等待。

例如,我曾经构建了一个需要来自多个 RESTful API 的数据的Node.js
应用程序。通过使用 promises 和 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);

 

 

Golang 中的异步编程

在探索Golang
期间,我对它对并发和异步编程的原生支持着迷,这要归功于 goroutines 和通道。

例如,在一个需要实时处理来自多个来源的数据的项目中,我利用 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)
    }
}

结论

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

 

来源:https://www.uudwc.com

标签:异步,编程,Java,Python,JavaScript,url,async
From: https://www.cnblogs.com/toycms/p/17511611.html

相关文章

  • Python - Ridiculous Rounding
     Python3uses“Banker’sRounding”whichisdefinedlikethis:“Exacthalfwaycasesarenowroundedtothenearestevenresultinsteadofawayfromzero”-perWhat’snewinPython3.Inthecaseof1.5,Pythonroundstotwobecausethatisthenear......
  • Java阻塞队列原理
    阻塞队列,关键字是阻塞,先理解阻塞的含义,在阻塞队列中,线程阻塞有这样的两种情况:1.当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。2.当队列中填满数据的情况下,生产者端的所有线程都会自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。阻塞队列的......
  • (Python编程)集成代码生成器SWIG
    ProgrammingPython,3rdEdition翻译最新版本见:http://wiki.woodpecker.org.cn/moin/PP3eD22.6.TheSWIGIntegrationCodeGenerator22.6.集成代码生成器SWIGButdon'tdothat.Asyoucanprobablytell,manualcodingofCextensionscan......
  • (Python编程)Jython:Java的Python
    ProgrammingPython,3rdEdition翻译最新版本见wiki:http://wiki.woodpecker.org.cn/moin/PP3eD欢迎参与翻译与修订。18.4.Jython:PythonforJava18.4.Jython:Java的PythonJython(formerlyknownasJPython)isanentirelydistinctimpleme......
  • web和java哪个就业更好?
    首先,要区分两种开发语言的特点:Java是一种后台的语言,类似于php,主要做的就是把数据库搭建好,以及数据放置到网页当中,java是比较复杂的编程语言。Web前端开发相对应的职位可能就是一些web前端开发工程师,主要工作是把ui设计师设计好的psd利用html,制作成网页,web前端工程师布局网站的结......
  • java陷阱之不可忽视的慢sql
    说明记录一下,以前处理方式,都是线上cpu告警运维查看数据库mysql提供给研发改。记录一下操作方式,我觉得应该研发定期去上线拿慢sql日志,再做更改,因为很多慢sql在低峰期并不会给数据库性能带来瓶颈但是高峰期来就会遇到高CPU阻塞业务,那个时候再去优化就会很着急  阿里云慢......
  • Python time和datetime模块
    Pythontime和datetime模块标准库time与datetime时间的3中格式:时间戳时间戳-->struct_timetime.gmtime(UTC时间)time.localtime(本地时区时间)struct_time()struct_time-->时间戳time.mktimestruct_time-->格式化的字......
  • JAVA 草稿
    1.项目启动报错:Failedtostartbean'documentationPluginsBootstrapper'度娘解释:swagger的匹配模式进行调整导致,导致默认的匹配默认在springboot中不会使用,导致报错。处理方式:(不建议降低springboot版本,调整太大了)spring:mvc:pathmatch:matching-strategy......
  • java 解析csv
    opencsvjava读取csv的类库主要有两种,opencsv和javacsv,研究发现,javacsv最后一次更新是2014-12-10,很久不维护了。opencsv是apache的项目,并且至今仍在维护,所以决定使用opencsv。csvcsv文件,全名commaseparatedvalues,默认以逗号分隔,是纯文本文件。虽然用excel打开后格式排版了,但是那......
  • java 序列化 serialVersionUID transient
    问题再现User类实现了序列化,但是没有声明版本号,这个对象放在memcache中,User新添加了1个字段后,把之前的对象从缓存中取出来时,出现了InvalidClassException,为什么会出现这个错误?序列化序列化就是将对象转为流,用于传输或保存。序列化的是“对象状态”,所以就不包括静态变量;反序列化是从......