作者丨Andrei Tetka
策划丨千山
作为一名拥有多年Java经验的抱异步软件开发人员,当我最近切换到Python进行一个新项目时,何Jt和我发现自己很感兴趣。中拥这种转变促使我探索各种语言的抱异步异步编程世界,包括Java,何Jt和Python,中拥JavaScript和Golang。抱异步本文是我对这些语言的探索和个人经验的结果,旨在提供对异步编程技术和示例的见解。
当我第一次开始用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后,我最初受到异步编程的不同方法的挑战。但是,在了解了asyncio库和async/await语法后,我发现它是一个强大而优雅的解决方案。
我曾经实现过一个基于Python的微服务,需要进行多次API调用。通过利用asyncio和async/await,我能够并发执行这些调用,并显著缩短整体响应时间:
import aiohttpimport asyncioasync 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时,我很欣赏它对异步编程的固有支持。因此,我在各种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 URLsfetchData(urls);
在我探索Golang的过程中,我对它对并发和异步编程的原生支持着迷,这要归功于goroutines和channels。
例如,在处理一个需要实时处理来自多个来源的数据的项目时,我利用goroutines和通道来有效地管理资源并同步数据流:
package mainimport ( "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://dzone.com/articles/embracing-asynchrony-in-java-python-javascript-and
责任编辑:武晓燕 来源: 51CTO技术栈 JavaPythonJavaScript(责任编辑:综合)
干掉 PowerDesigner!这款国人开源的数据库设计工具真香!
为什么借呗变成信用贷后借不出来了 金融机构无法正常放款了吗?
中国中冶(601618)融资余额12.39亿元 融券余额1509.92万元(03