Questions tagged «asynchronous»

异步编程是一种用于延迟具有高延迟或低优先级的操作的策略,通常是为了提高软件的性能,响应能力和/或可组合性。通常使用事件驱动的编程和回调的某种组合来采用此类策略,并且可以选择通过协程和/或线程并发使用。

12
如何在Java中异步调用方法
我最近一直在研究Go的goroutine,并且认为在Java中拥有类似的东西会很好。就我搜索的并行化方法调用的通用方法而言,它是执行以下操作: final String x = "somethingelse"; new Thread(new Runnable() { public void run() { x.matches("something"); } }).start(); 那不是很优雅。有更好的方法吗?我在项目中需要这样的解决方案,因此我决定围绕异步方法调用实现自己的包装器类。 我在J-Go中发布了包装器类。但是我不知道这是否是一个好的解决方案。用法很简单: SampleClass obj = ... FutureResult<Integer> res = ... Go go = new Go(obj); go.callLater(res, "intReturningMethod", 10); //10 is a Integer method parameter //... Do something else //... System.out.println("Result: "+res.get()); //Blocks until …

19
异步加载脚本
我正在使用JQuery的几个插件,自定义窗口小部件和其他一些库。结果,我有几个.js和.css文件。我需要为网站创建一个加载器,因为加载需要一些时间。如果可以在导入所有内容之前显示加载程序,那就太好了: <script type="text/javascript" src="js/jquery-1.6.2.min.js"></script> <script type="text/javascript" src="js/myFunctions.js"></script> <link type="text/css" href="css/main.css" rel="stylesheet" /> ... .... etc 我找到了一些教程,这些教程使我能够异步导入JavaScript库。例如,我可以做类似的事情: (function () { var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = 'js/jquery-ui-1.8.16.custom.min.js'; var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })(); 由于某种原因,当我对所有文件执行相同操作时,页面将无法正常工作。我已经尝试了很长时间,试图找到问题所在,但我只是找不到。首先,我认为这可能是因为某些javascript函数依赖于其他javascript函数。但是当我完成下一个任务时,我使用超时功能以正确的顺序加载了它们,然后继续执行下一个任务,页面仍然表现得很奇怪。例如,我无法单击链接等...动画仍然可以工作.. 无论如何 这就是我一直在想的...我认为浏览器具有缓存,这就是为什么第一次和第二次快速加载页面需要较长时间的原因。所以我想做的是用一个异步加载所有这些文件的页面替换index.html页面。当ajax完成加载后,所有这些文件都将重定向到我计划使用的页面。使用该页面时,加载时间不会太长,因为文件应该包含在浏览器的缓存中。在我的索引页面上(异步加载.js和.css文件的页面),我不在乎出现错误。我将只显示一个加载器,并在完成后重定向页面... 这个想法是一个好的选择吗?还是应该继续尝试实现异步方法? 编辑 我加载所有异步数据的方式如下: importScripts(); function importScripts() { //import: …

7
socket.shutdown与socket.close
我最近看到了一些看起来像这样的代码(袜子当然是套接字对象): sock.shutdown(socket.SHUT_RDWR) sock.close() 在套接字上调用shutdown然后关闭它的目的是什么?如果有所不同,则此套接字用于非阻塞IO。

8
SyntaxError:意外的令牌功能-异步等待Node.js
我正在尝试将Node 6.2.1版与一些代码一起使用。计划将大多数面向超级回调的代码迁移到看起来更干净甚至性能更好的代码上。 我不知道为什么,当我尝试执行节点代码时,终端抛出一个错误。 helloz.js (async function testingAsyncAwait() { await console.log("Print me!"); })(); 日志- BOZZMOB-M-T0HZ:rest bozzmob$ node helloz.js /Users/bozzmob/Documents/work/nextgennms/rest/helloz.js:1 (function (exports, require, module, __filename, __dirname) { (async function testingAsyncAwait() { ^^^^^^^^ SyntaxError: Unexpected token function at Object.exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:513:28) at Object.Module._extensions..js (module.js:550:10) at Module.load (module.js:458:32) at tryModuleLoad (module.js:417:12) at …

10
如何在Node.js或Javascript中将异步函数调用包装到同步函数中?
假设您维护一个公开一个函数的库getData。您的用户调用它来获取实际数据: var output = getData(); 数据被保存在文件中,因此您可以getData使用内置的Node.js来实现fs.readFileSync。两者都很明显,getData并且fs.readFileSync都是同步功能。有一天,您被告知将基础数据源切换到一个仓库,例如只能异步访问的MongoDB。还被告知要避免惹恼您的用户,getDataAPI不能更改为仅返回promise或要求回调参数。您如何满足这两个要求? 使用回调/承诺的异步功能是JavasSript和Node.js的DNA。任何不平凡的JS应用程序都可能会渗透这种编码样式。但是这种做法很容易导致所谓的厄运回响金字塔。更糟糕的是,如果调用链中任何调用方中的任何代码都取决于异步函数的结果,则这些代码也必须包装在回调函数中,从而在调用方上施加编码样式约束。我不时发现有必要将异步功能(通常在第三方库中提供)封装到同步功能中,以避免大规模的全局重构。在这个问题上寻找解决方案通常以节点光纤结束或从中派生的npm软件包。但是,光纤无法解决我面临的问题。甚至Fibers作者提供的示例也说明了这一缺陷: ... Fiber(function() { console.log('wait... ' + new Date); sleep(1000); console.log('ok... ' + new Date); }).run(); console.log('back in main'); 实际输出: wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST) back in main ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST) 如果功能Fiber确实将异步功能睡眠转变为同步,则输出应为: wait... Fri Jan 21 …


4
Node JS Promise.all和forEach
我有一个类似结构的数组,它公开了异步方法。异步方法调用返回数组结构,从而返回更多异步方法。我正在创建另一个JSON对象来存储从该结构获得的值,因此我需要注意跟踪回调中的引用。 我已经编写了一个蛮力解决方案,但是我想学习一个更惯用或干净的解决方案。 对于n级嵌套,该模式应该是可重复的。 我需要使用promise.all或其他类似的技术来确定何时解析封闭例程。 并非每个元素都必然涉及进行异步调用。因此,在嵌套promise.all中,我不能仅基于索引对我的JSON数组元素进行分配。不过,我确实需要在嵌套的forEach中使用诸如promise.all之类的内容,以确保在解析封闭例程之前已进行了所有属性分配。 我正在使用bluebird promise lib,但这不是必需的 这是一些部分代码- var jsonItems = []; items.forEach(function(item){ var jsonItem = {}; jsonItem.name = item.name; item.getThings().then(function(things){ // or Promise.all(allItemGetThingCalls, function(things){ things.forEach(function(thing, index){ jsonItems[index].thingName = thing.name; if(thing.type === 'file'){ thing.getFile().then(function(file){ //or promise.all? jsonItems[index].filesize = file.getSize();

6
如何正确地使用async / await读取文件?
我无法弄清楚async/的await运作方式。我有点理解,但无法使其正常工作。 function loadMonoCounter() { fs.readFileSync("monolitic.txt", "binary", async function(err, data) { return await new Buffer( data); }); } module.exports.read = function() { console.log(loadMonoCounter()); }; 我知道我可以使用readFileSync,但如果这样做,我知道我永远不会理解async/ await我只会埋葬这个问题。 目标:调用loadMonoCounter()并返回文件的内容。 该文件在每次incrementMonoCounter()调用时都会递增(每次加载页面)。该文件包含二进制缓冲区的转储,并存储在SSD中。 无论我做什么,都会出现错误或undefined在控制台中。

10
如何从Python异步运行外部命令?
我需要从Python脚本异步运行Shell命令。我的意思是,我希望我的Python脚本能够在外部命令关闭并继续执行所需操作的同时继续运行。 我读了这篇文章: 在Python中调用外部命令 然后我os.system()去做了一些测试,如果我&在命令末尾使用它,看起来就可以完成这项工作,这样我就不必等待它返回。我想知道的是,这是否是完成此任务的正确方法?我试过了,commands.call()但是对我来说不起作用,因为它会阻塞外部命令。 请告诉我是否os.system()建议这样做,或者我应该尝试其他方法。

4
我应该避免使用“异步无效”事件处理程序吗?
我知道使用即弃即用async void方法启动任务通常被认为是一个坏主意,因为没有跟踪待处理任务的信息,并且处理此类方法中可能引发的异常非常棘手。 我是否也应该一般避免使用async void事件处理程序?例如, private async void Form_Load(object sender, System.EventArgs e) { await Task.Delay(2000); // do async work // ... } 我可以这样重写它: Task onFormLoadTask = null; // track the task, can implement cancellation private void Form_Load(object sender, System.EventArgs e) { this.onFormLoadTask = OnFormLoadTaskAsync(sender, e); } private async Task OnFormLoadTaskAsync(object sender, …

8
如何在Playground中运行异步回调
许多Cocoa和CocoaTouch方法都将完成回调实现为Objective-C中的块,而实现为Swift中的Closures。但是,在Playground中尝试这些操作时,永远不会调用完成操作。例如: // Playground - noun: a place where people can play import Cocoa import XCPlayground let url = NSURL(string: "http://stackoverflow.com") let request = NSURLRequest(URL: url) NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() { response, maybeData, error in // This block never gets called? if let data = maybeData { let contents = NSString(data:data, encoding:NSUTF8StringEncoding) println(contents) …

1
为了避免昂贵的线程创建,C ++ 11中的async(launch :: async)是否会使线程池过时?
它与以下问题大致相关:std :: thread是否在C ++ 11中池化?。尽管问题有所不同,但目的是相同的: 问题1:使用自己的(或第三方库)线程池来避免创建昂贵的线程是否仍然有意义? 另一个问题的结论是,您不能依靠std::thread被池化(它可能会也可能不会)。但是,std::async(launch::async)似乎有更高的机会被合并。 它不认为这是标准的强制要求,但是恕我直言,我希望所有好的C ++ 11实现都可以在线程创建缓慢的情况下使用线程池。我希望仅在廉价的平台上创建新线程,我希望它们总是产生新线程。 问题2:这就是我的想法,但我没有事实可以证明。我很可能会误会。这是有根据的猜测吗? 最后,在这里,我提供了一些示例代码,这些代码首先显示了我认为如何通过async(launch::async)以下方式表达线程创建: 范例1: thread t([]{ f(); }); // ... t.join(); 变成 auto future = async(launch::async, []{ f(); }); // ... future.wait(); 示例2:触发并忘记线程 thread([]{ f(); }).detach(); 变成 // a bit clumsy... auto dummy = async(launch::async, []{ f(); }); // ... but …

2
等待与task.Result相同的已完成任务?
我目前正在阅读Stephen Cleary撰写的“ C#Cookbook中的并发性 ”,并且注意到以下技术: var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask; downloadTask是对的调用httpclient.GetStringAsync,timeoutTask正在执行Task.Delay。 如果它没有超时,则downloadTask已经完成。downloadTask.Result考虑到任务已经完成,为什么需要第二次等待而不是返回?

5
如何使用CancellationToken属性?
与前面的RulyCanceler类代码相比,我想使用来运行代码 CancellationTokenSource。 如取消令牌中所述,如何使用它,即不引发/捕捉异常?我可以使用IsCancellationRequested财产吗? 我试图这样使用它: cancelToken.ThrowIfCancellationRequested(); 和 try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } 但这cancelToken.ThrowIfCancellationRequested();在方法中产生了运行时错误Work(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, …

2
Task <int>如何变成int?
我们有这种方法: async Task&lt;int&gt; AccessTheWebAsync() { HttpClient client = new HttpClient(); Task&lt;string&gt; getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); // You can do work here that doesn't rely on the string from GetStringAsync. DoIndependentWork(); string urlContents = await getStringTask; //The thing is that this returns an int to a method that has a return type …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.