标签: coroutine

Java中可用的协程库

我想用Java做一些事情,如果使用并发例程编写会更清楚,但是对于哪些完全线程严重过度杀伤.当然,答案是使用协同程序,但标准Java库中似乎没有任何协程支持,而快速谷歌在这里或那里会带来诱人的提示,但没有什么实质性的.

这是我到目前为止所发现的:

  • JSIM有一个协程类,但它看起来非常重量级,并且看起来与点上的线程混淆.这样做的目的是降低全面线程的复杂性,而不是添加它.此外,我不确定该类是否可以从库中提取并独立使用.
  • Xalan有一个coroutine set类,可以执行类似coroutine的东西,但是如果可以从整个库中有意义地提取它,那么它仍然是可疑的.它看起来像是一个严格控制的线程池形式,而不是实际的协同程序.
  • 有一个谷歌代码项目看起来像我所追求的,但如果有什么它看起来比使用线程更重量级.我基本上对需要软件在运行时动态更改JVM字节码以完成其工作的事情感到紧张.这看起来有点矫枉过正,并且会像协同程序解决的那样导致更多问题.此外,它似乎没有实现整个协程概念.通过我的一瞥,它提供了一个yield只返回调用者的功能.正确的协同程序允许yields将控制权直接转移到任何已知的协程.基本上这个库,重量级和可怕的,只给你支持迭代器,而不是完全通用的协同程序.
  • 有希望命名的Coroutine for Java失败了,因为它是一个特定于平台(显然使用JNI)的解决方案.

这就是我发现的一切.

我知道Da Vinci机器中对协同程序的本机JVM支持,我也知道这样做的JNI延续技巧.然而,对我来说这些并不是一个很好的解决方案,因为我不一定能控制我的代码运行在哪个VM或平台上.(事实上​​,任何字节码操作系统都会遇到类似的问题 - 如果可能的话,最好是纯Java.运行时字节码操作会限制我在Android上使用它.例如.)

那么有人有任何指针吗?这甚至可能吗?如果没有,是否可以在Java 7中使用?


编辑添加:

只是为了确保混乱载,这是一个相关的问题我的另外一个,但又不尽相同.这个是寻找现有的实施方案,以避免不必要地重新发明轮子.另一个是关于如何在Java中实现协同程序的问题,如果这个问题无法解决的话.目的是在不同的线程上保留不同的问题.


进一步编辑添加:

答案被选中.然而,有些评论是有条理的.库指向的不是一个协程库,所以它在技术上不回答我的问题.尽管如此,它与上面链接的Google Code项目有两个优势:

  1. 两种解决方案都使用字节码操作,但所选的库允许静态字节码操作,这使得它可以在Android和其他不兼容的JVM堆栈中使用.
  2. Google Code项目不会执行完整协同程序.虽然答案的库甚至根本不做协同程序,但它确实做了一些更重要的事情:它为滚动我自己的全功能协程提供了一个很好的基础工具.

java coroutine

42
推荐指数
4
解决办法
1万
查看次数

C#中的协同程序

我正在寻找在c#中实现协同例程(用户调度线程)的方法.使用c ++时我使用的是光纤.我在互联网上看到C#中不存在光纤.我想获得类似的功能.

有没有"正确"的方法在c#中实现协同程序?

我曾想过使用在调度程序线程上获取单个执行互斥锁+ 1的线程来实现它,该线程为每个协同程序释放这个互斥锁.但这似乎非常昂贵(它强制每个协程之间的上下文切换)

我也看过了yield迭代器的功能,但据我所知,你不能在内部函数中产生(仅在原始的ienumerator函数中).所以这对我有点好处.

c# coroutine fiber

40
推荐指数
4
解决办法
5万
查看次数

Kotlin Coroutines在Android中正确的方式

我正在尝试使用异步更新适配器内的列表,我可以看到有太多的样板.

这是使用Kotlin Coroutines的正确方法吗?

这可以更优化吗?

fun loadListOfMediaInAsync() = async(CommonPool) {
        try {
            //Long running task 
            adapter.listOfMediaItems.addAll(resources.getAllTracks())
            runOnUiThread {
                adapter.notifyDataSetChanged()
                progress.dismiss()
            }
        } catch (e: Exception) {
            e.printStackTrace()
            runOnUiThread {progress.dismiss()}
        } catch (o: OutOfMemoryError) {
            o.printStackTrace()
            runOnUiThread {progress.dismiss()}
        }
    }
Run Code Online (Sandbox Code Playgroud)

android coroutine async-await kotlin

38
推荐指数
4
解决办法
3万
查看次数

PEP 0492 - Python 3.5异步关键字

PEP 0492async关键字添加到Python 3.5.

Python如何从使用此运算符中受益?协程的例子是

async def read_data(db):
    data = await db.fetch('SELECT ...')
Run Code Online (Sandbox Code Playgroud)

根据这个文件实现

暂停执行read_data协同程序,直到db.fetch等待完成并返回结果数据.

async关键字是否实际涉及新线程的创建或可能使用现有的保留异步线程?

async确实使用保留线程的情况下,它们各自是一个共享线程吗?

python asynchronous coroutine python-3.x async-await

34
推荐指数
1
解决办法
3073
查看次数

Lua协同程序甚至适用于什么?为什么这段代码不像我期望的那样工作?

我无法理解这段代码......我期待类似于线程的东西,我会得到一个输出随机的"nooo"和"yaaaay"互相穿插,因为它们都是异步打印,而是我发现主线程似乎阻止第一次调用coroutine.resume(),从而防止下一个被启动,直到第一个产生.

如果这是预期的操作协同程序,它们有什么用处,我将如何实现我希望的目标?我是否必须为这些协同程序实现我自己的调度程序才能异步操作?因为这看起来很混乱,我也可以使用函数!

co1 = coroutine.create(function ()
        local i = 1
        while i < 200 do
                print("nooo")
                i = i + 1
        end
        coroutine.yield()
end)

co2 = coroutine.create(function ()
        local i = 1
        while i < 200 do
                print("yaaaay")
                i = i + 1
        end
        coroutine.yield()
end)

coroutine.resume(co1)
coroutine.resume(co2)
Run Code Online (Sandbox Code Playgroud)

lua multithreading coroutine

33
推荐指数
3
解决办法
2万
查看次数

"yield from"语法在asyncio中的作用是什么?它与"await"有什么不同?

从谁写ASYNCIO代码,但正在寻求更好地理解内部工作的人的角度来看,是什么yield from,await以及如何允许异步代码这些有用吗?

有一个高度赞成的问题询问yield from语法的用法和解释异步和等待的问题,但两者都深入讨论了不同的主题,并不是对底层代码及其如何适应asyncio的简明解释.

python generator coroutine async-await python-asyncio

32
推荐指数
1
解决办法
9130
查看次数

GlobalScope 与 CoroutineScope 与生命周期范围

AsyncTask由于它的简单性,我习惯于使用它并很好地理解它。但Coroutines让我感到困惑。您能否以简单的方式向我解释以下各项的区别和目的?

  1. GlobalScope.launch(Dispatchers.IO) {}
  2. GlobalScope.launch{}
  3. CoroutineScope(Dispatchers.IO).launch{}
  4. lifecycleScope.launch(Dispatchers.IO){}
  5. lifecycleScope.launch{}

android coroutine kotlin-coroutines

32
推荐指数
4
解决办法
9693
查看次数

loop.create_task,asyncio.async/ensure_future和Task之间有什么区别?

我对某些asyncio功能感到有些困惑.我看到有BaseEventLoop.create_task(coro)安排合作例程的功能.文档create_task说它是一个新函数和兼容性,我们应该asyncio.async(coro)通过再次引用docs来看到它是一个别名,asyncio.ensure_future(coro)它再次调度一个协同例程的执行.

与此同时,我一直在Task(coro)用于调度协同例程执行,而且似乎也工作得很好.那么,这些之间的区别是什么?

python coroutine python-3.x python-asyncio

31
推荐指数
1
解决办法
7236
查看次数

通过回调将函数转换为Python生成器?

Scipy最小化函数(仅用作示例),可以选择在每一步添加回调函数.所以我可以做点什么,

def my_callback(x):
    print x
scipy.optimize.fmin(func, x0, callback=my_callback)
Run Code Online (Sandbox Code Playgroud)

有没有办法使用回调函数来创建fmin的生成器版本,这样我才能做到,

for x in my_fmin(func,x0):
    print x
Run Code Online (Sandbox Code Playgroud)

似乎可能有一些产量和发送的组合,但我可以想到任何事情.

python generator coroutine

30
推荐指数
3
解决办法
5716
查看次数

测试函数或方法是正常还是异步

如何确定函数或方法是正常函数还是异步函数?我希望我的代码能够自动支持普通或异步回调,并且需要一种方法来测试传递的函数类型.

async def exampleAsyncCb():
    pass

def exampleNomralCb():
    pass

def isAsync(someFunc):
    #do cool dynamic python stuff on the function
    return True/False

async def callCallback(cb, arg):
    if isAsync(cb):
        await cb(arg)
    else:
        cb(arg)
Run Code Online (Sandbox Code Playgroud)

根据传递的函数类型,它应该正常运行或使用await运行.我尝试了各种各样的东西,但不知道如何实现isAsync().

python asynchronous coroutine python-3.x python-3.5

30
推荐指数
4
解决办法
8468
查看次数