python 异步方法,python3 异步编程
已经决定了。
因为转载的文章在这里显示了出处,之前的报道转发了,但是有时候找不到出处,或者有其他原因。请理解。
如有冒犯请联系我,或删除,或注明出处。
对于好的文章,以前想收藏,但是有时候连接失败,所以现在碰到好的,直接转到自己的地方。
来自http://baike.Baidu.com/view/185289.htm的原创
如何定义异步调用,使得操作可以继续进行,而不需要等待被调用函数的返回值。2例异步通话就是你请朋友吃饭。说你的朋友知道他们忙的时候会来找你,你就干点别的。同步通话就是你请朋友吃饭。因为你的朋友很忙,所以你一直在那里等我。当你的朋友忙的时候,我会和你一起去。3实际用法操作系统发展至今,thread是其代表作之一。操作系统将CPU的处理时间分成许多短时间片,在时间T1执行一个线程的指令,在时间T2执行下一个线程的指令。每个线程轮流执行,结果所有的线程看起来都是并排前进。这样,在编程过程中可以同时创建和运行多个线程,每个线程可以“并行”执行不同的任务。在单线程方法中,计算机是严格意义上的dpdzc机器。当一个代码调用另一个代码时,只能使用同步调用。在执行这段代码并返回结果之前,调用方无法转到下一段代码。多线程支持允许异步调用。调用者和被调用者可以属于两个不同的线程,调用者可以在启动被调用者线程后继续执行后续代码,而不需要等待对方返回结果。被叫方完成执行后,通过某种方式通知主叫方。结果出来了,请酌情处理。有些电脑需要一些时间来处理。在调用这样的处理代码时,如果调用者迫不及待地站在那里,就会严重影响程序的性能。例如,在一个程序启动后,需要打开一个文件来读出数据。当基于这些数据进行一系列初始化过程时,很难显示程序的主窗口,程序不能等待。异步调用可以轻松解决问题,太可惜了。把整个初始化过程放到一个线程里,主线程启动线程,然后下移即时显示主窗口。当用户一直盯着窗口时,初始化过程在后台完成。在程序开始稳定运行后,您可以继续使用该技术来提高交互的瞬时响应。当用户点击鼠标时,如果刺激操作比较费时,点击鼠标不会立刻反应,整个程序看起来比较沉重。异步调用过程中耗时的操作,让主线程可以随时等待下一条消息,让用户点击鼠标更加方便快捷,对软件有一定的好感。调用异步外部数据处理异步调用对于处理外部输入数据特别有用。如果计算机需要向低速设备请求数据,那么就会有一个冗长的数据处理过程,采用同步调用显然是不经济的。向计算机的外部设备发出请求,然后等待数据输入。外部设备向计算机发送数据后,应在计算机完成数据处理后发送下一个数据请求。双方都有等待时间,延长了整个处理过程。实际上,计算机可以在处理数据之前发出以下数据请求,并立即处理数据。如果数据处理速度快于数据采集,只有计算机可以等待,外部设备可以连续采集数据。如果计算机同时连接多个输入设备,它可以依次向每个设备发送数据请求,以随时处理来自每个设备的数据,从而使整个系统连续高速运行。编程的关键是将数据请求代码和数据处理代码分配给两个不同的线程。数据处理代码调用数据请求的异步函数,使用track处理手头的数据。当下一组数据到达时,会通知数据处理线程,退出等待状态,发出下一个数据请求,然后继续处理数据。对于异步呼叫,呼叫者不等待被叫方返回结果就转身离开,因此需要一种机制来允许被叫方在结果出来时通知呼叫者。虽然在同一个进程中可以使用很多方法,但是常用的方法是回调、互斥和消息。
回调方法很简单。调用异步函数时,在参数中输入函数地址。异步函数可以保存这个地址,并在结果出现时回调以通知调用者。通过将异步函数包装在对象中,可以用事件替换回调函数的地址,并通过事件处理例程向调用者发送通知。互斥体是Windows系统提供的一个通用同步对象,用来使异步进程中不同线程之间的步骤保持一致。如果呼叫者暂时无法执行任何操作,您可以调用等待功能并在那里等待。此时,互斥体处于无符号状态。调用者给出结果后,互斥对象被置于有信号状态,等待函数自动结束等待,重新运行调用者,从调用者处取出处理结果。这种方法比回调方法稍微复杂一点,也慢一点,但是它很灵活,可以做出很多模式来处理复杂的处理系统。Windows消息通知是一个不错的选择,但是,
简单又安全。用户消息在程序中定义,消息处理例程由调用者准备。在被叫方得出结果后,这个消息立即被发送给主叫方,结果通过两个参数传输:WParam和LParam。消息总是与窗口句柄相关联,因此调用方必须使用窗口来接收消息,这是不方便的。另外,通过消息联系会影响速度,在需要高速处理时,回调方式更有优势。如果调用者和被调用者属于两个不同的进程,由于内存空间的差距,使用Windows messages发送通知一般简单可靠,被调用者可以借助消息本身向调用者发送数据。事件也可以通过名称在不同的进程之间共享,但是它们只能发送通知,而不能传输数据。它们需要使用内存共享方式,如Windows消息和文件映射,或者使用通信方式,如邮件槽和管道。异步调用原理异步调用原理并不复杂,但是在实际使用中容易出现莫名其妙的问题,尤其是不同线程共享代码或者数据的时候。在编程的时候,需要时刻注意这种共享是否存在,通过各种状态标志来避免冲突。Windows系统提供的互斥对象在这里用起来特别方便。互斥体一次只能有一个辖区。在一个线程放弃其权限后,另一个线程可以接管。当一个线程在敏感区执行时,它先接管互斥体,这样其他线程就被wait函数阻塞了;离开敏感区域后立即放弃管辖权,这样wait函数将结束等待,另一个线程将有机会访问敏感区域。这样可以有效防止多个线程进入同一个敏感区域。因为异步调用容易出问题,设计一个安全高效的编程方案需要更多的设计经验,所以最好不要滥用异步调用。同步调用,毕竟让人更舒服:不管程序走到哪里,只要盯着动点,就会知道是什么,不会像异步调用一样总觉得四面受敌,心神不宁。必要时,您甚至可以将异步函数转换为同步函数。方法很简单:调用异步函数后立即调用wait函数,在那里等待,异步函数返回结果后再继续往下走。4异步调用使用方法TestMethod和异步委托的四个例子都使用同一个长时间运行的测试方法test method。该方法显示一条控制台消息,指示它已开始处理,休眠几秒钟,然后结束。TestMethod有一个out参数(在Visual Basic中为ByRef),它演示了如何将这些参数添加到BeginInvoke和EndInvoke的签名中。可以用类似的方式处理ref参数(在Visual Basic中为ByRef)。下面的代码示例演示TestMethod和代表TestMethod的委托;要使用任一示例,请将示例代码追加到该代码中。注意,为了简化这些例子,TestMethod是在独立于Main()的类中声明的。或者,TestMethod可以是包含Main()的同一个类中的静态方法(在Visual Basic中为Shared)。使用EndInvoke等待异步执行方法的异步调用的最简单方法是从BeginInvoke开始,在主线程上执行一些操作,然后调用EndInvoke。直到C#异步调用完成,EndInvoke才返回。这种技术非常适合文件或网络操作,但是因为它阻塞了EndInvoke,所以不要在用户界面的服务线程中使用它。使用WaitHandle等待异步调用WaitHandle是一种常见的线程同步技术。可以通过使用BeginInvoke返回的IAsyncResult的AsyncWaitHandle属性来获取WaitHandle。#当C的异步调用完成后,会发出WaitHandle信号,你可以通过调用它的WaitOne来等待它。如果使用WaitHandle,其他处理可以在C#异步调用完成之后,但在通过调用EndInvoke检索结果之前执行。轮询异步调用完成可以使用BeginInvoke返回的IAsyncResult的IsCompleted属性来确定C#异步调用何时完成。当从用户界面的服务线程发出C#异步调用时,可以执行此操作。
轮询的完成允许用户界面线程继续处理用户输入。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。