我想用Java做一些事情,如果使用并发例程编写会更清楚,但是对于哪些完全线程严重过度杀伤.当然,答案是使用协同程序,但标准Java库中似乎没有任何协程支持,而快速谷歌在这里或那里会带来诱人的提示,但没有什么实质性的.
这是我到目前为止所发现的:
yield只返回调用者的功能.正确的协同程序允许yields将控制权直接转移到任何已知的协程.基本上这个库,重量级和可怕的,只给你支持迭代器,而不是完全通用的协同程序.这就是我发现的一切.
我知道Da Vinci机器中对协同程序的本机JVM支持,我也知道这样做的JNI延续技巧.然而,对我来说这些并不是一个很好的解决方案,因为我不一定能控制我的代码运行在哪个VM或平台上.(事实上,任何字节码操作系统都会遇到类似的问题 - 如果可能的话,最好是纯Java.运行时字节码操作会限制我在Android上使用它.例如.)
那么有人有任何指针吗?这甚至可能吗?如果没有,是否可以在Java 7中使用?
编辑添加:
只是为了确保混乱载,这是一个相关的问题我的另外一个,但又不尽相同.这个是寻找现有的实施方案,以避免不必要地重新发明轮子.另一个是关于如何在Java中实现协同程序的问题,如果这个问题无法解决的话.目的是在不同的线程上保留不同的问题.
进一步编辑添加:
该答案被选中.然而,有些评论是有条理的.库指向的不是一个协程库,所以它在技术上不回答我的问题.尽管如此,它与上面链接的Google Code项目有两个优势:
我正在寻找在c#中实现协同例程(用户调度线程)的方法.使用c ++时我使用的是光纤.我在互联网上看到C#中不存在光纤.我想获得类似的功能.
有没有"正确"的方法在c#中实现协同程序?
我曾想过使用在调度程序线程上获取单个执行互斥锁+ 1的线程来实现它,该线程为每个协同程序释放这个互斥锁.但这似乎非常昂贵(它强制每个协程之间的上下文切换)
我也看过了yield迭代器的功能,但据我所知,你不能在内部函数中产生(仅在原始的ienumerator函数中).所以这对我有点好处.
我正在尝试使用异步更新适配器内的列表,我可以看到有太多的样板.
这是使用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) PEP 0492将async关键字添加到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确实使用保留线程的情况下,它们各自是一个共享线程吗?
我无法理解这段代码......我期待类似于线程的东西,我会得到一个输出随机的"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) 从谁写ASYNCIO代码,但正在寻求更好地理解内部工作的人的角度来看,是什么yield from,await以及如何允许异步代码这些有用吗?
有一个高度赞成的问题询问yield from语法的用法和解释异步和等待的问题,但两者都深入讨论了不同的主题,并不是对底层代码及其如何适应asyncio的简明解释.
AsyncTask由于它的简单性,我习惯于使用它并很好地理解它。但Coroutines让我感到困惑。您能否以简单的方式向我解释以下各项的区别和目的?
GlobalScope.launch(Dispatchers.IO) {}GlobalScope.launch{}CoroutineScope(Dispatchers.IO).launch{}lifecycleScope.launch(Dispatchers.IO){}lifecycleScope.launch{}我对某些asyncio功能感到有些困惑.我看到有BaseEventLoop.create_task(coro)安排合作例程的功能.文档create_task说它是一个新函数和兼容性,我们应该asyncio.async(coro)通过再次引用docs来看到它是一个别名,asyncio.ensure_future(coro)它再次调度一个协同例程的执行.
与此同时,我一直在Task(coro)用于调度协同例程执行,而且似乎也工作得很好.那么,这些之间的区别是什么?
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)
似乎可能有一些产量和发送的组合,但我可以想到任何事情.
如何确定函数或方法是正常函数还是异步函数?我希望我的代码能够自动支持普通或异步回调,并且需要一种方法来测试传递的函数类型.
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().
coroutine ×10
python ×5
async-await ×3
python-3.x ×3
android ×2
asynchronous ×2
generator ×2
c# ×1
fiber ×1
java ×1
kotlin ×1
lua ×1
python-3.5 ×1