作为这个问题的后续,我试图绕过range(int(1e8))使用生成器的例子列表xrange(int(1e8)).其中xrange只是一个产生长序列值的过程的例子.(请假设它不能轻易复制.)还有一些背景知识,我有一长串的时间戳/值对,我想对它进行一些处理(有时间序列).我试图避免将这些内容整体记录到内存中,因为这是很多数据.
我认为如果我可以将多个处理单元同时应用于我的生成器生成的数据流,那将会很酷.第一个想法是使用itertools.tee(),例如:
from itertools import tee
g1,g2 = tee(xrange(int(1e8)),2)
sum(g1), sum(g2)
Run Code Online (Sandbox Code Playgroud)
但后来我发现只有第一个sum()会使用生成器,而tee()内部list再次构建一个(我想避免它).
所以我想,我需要一个异步解决方案,即允许每个sum()都在每个生成器步骤进行更新的解决方案.想到的东西在哪里
但是我之前没有真正使用过,部分我甚至无法判断这些方法是否有效,或者是有效/高效/高效的.
从这一点来说,我很乐意感谢观众的任何建议!
更新
我想避免使用基于回调的解决方案,因为它显着地降低了性能(这是它当前实现的方式).我在下面添加了一些分析(如果测试不客观,请添加注释):
class SinkA:
def __init__(self, src):
for i in src: pass
class SinkB:
def f(self,i):
pass
class Source:
def __iter__(self):
for i in xrange(int(1e4)):
yield i
def t1():
src = Source()
snk = SinkA(src)
def t2():
src = Source()
snk = …Run Code Online (Sandbox Code Playgroud) 在过去的12个小时里,我一直在研究这个问题,而我似乎无法随时随地.我甚至都不知道这是否可能,但我希望这是因为继续我的项目会有很长的路要走.
我试图做的是创建协同程序,因此我使用的特定程序不会因为无法执行异步http请求而冻结.我已经想出了如何做到这一点,尽管我对协同程序的理解仍然在"嗯?这是如何工作的?" 相.我现在的问题是能够使用正确的信息响应多个请求.例如,以下内容应产生三个单独的响应:
foo(a)
foo(b)
foo(c)
Run Code Online (Sandbox Code Playgroud)
其中foo使用里面的参数启动协同程序.如果全部单独请求,则返回正确的结果.但是,如果作为块请求,它将仅返回foo(c)结果.现在,我理解这背后的原因,但是当我作为一个块请求时,我找不到让它返回所有三个结果的方法.为了帮助理解这个问题,这里是实际的代码:
function background_weather()
local loc = url.escape(querystring)
weatherpage = http.request("http://api.wunderground.com/api/004678614f27ceae/conditions/q/" .. loc .. ".json")
wresults = json.decode(weatherpage)
--process some stuff here, mainly datamining
end
--send datamined information as a response
coroutine.yield()
end
Run Code Online (Sandbox Code Playgroud)
和协程的创建:
function getweather ()
-- see if backgrounder running
if background_task == nil or
coroutine.status (background_task) == "dead" then
-- not running, create it
background_task = coroutine.create (background_weather)
-- make timer to keep it going
AddTimer ("tickler", 0, …Run Code Online (Sandbox Code Playgroud) from tornado import web, gen
import tornado, time
class CoroutineFactorialHandler(web.RequestHandler):
@web.asynchronous
@gen.coroutine
def get(self, n, *args, **kwargs):
n = int(n)
def callbacker(iterator, callback):
try:
value = next(iterator)
except StopIteration:
value = StopIteration
callback(value)
def factorial(n):
x = 1
for i in range(1, n+1):
x *= i
yield
yield x
iterator = factorial(n)
t = time.time()
self.set_header("Content-Type", "text/plain")
while True:
response = yield gen.Task(callbacker, iterator)
#log.debug("response: %r" %response)
if response is StopIteration:
break
elif response:
self.write("took : %f sec" %(time.time() - …Run Code Online (Sandbox Code Playgroud) 我想在 Prolog 中构建我自己的协程。我想添加一些额外的功能。
我一直在尝试为我正在从事的项目构建“事件系统”。这是我的操作方法:我参照一个gameObject以及需要从该gameObject执行的功能填充一个列表。然后,当“事件”被触发时(在这种情况下,当玩家进入触发对撞机时),我只需遍历列表并调用其中的功能。
问题在于列表中的每个函数都同时执行。在某些情况下这可以正常工作,但是如果我想创建一个更具电影风格的事件,我需要有能力在上一个函数完成执行后执行一个函数。可悲的是,我不知道该怎么做。
我已经阅读了很多有关协程和委托的Unity和C#文档,但是我似乎无法将所有这些东西都缠起来,并找到一种在代码上实现它们的方法。因此,我需要您的帮助:我如何实现这一目标?
我把头放在Kotlin / Android中的协程概念上。因此,由于我不想使用Timertask,所以处理程序延迟发布,我想使用协程在一定延迟后执行异步协程。我有以下半代码:
launch(UI) {
val result = async(CommonPool) {
delay(30000)
executeMethodAfterDelay()
}
result.await()
}
Run Code Online (Sandbox Code Playgroud)
问题是实际上在异步中,两个方法(delay和executeMethodAfterDelay)是同时执行的。当我期望在执行executeMethodAfterDelay()之前引入前30秒的延迟。所以我的问题是,我怎样才能做到这一点?
我需要做平行平面图。假设我有以下代码:
val coll: List<Set<Int>> = ...
coll.flatMap{set -> setOf(set, set + 1)}
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西:
coll.pFlatMap{set -> setOf(set, set + 1)} // parallel execution
Run Code Online (Sandbox Code Playgroud) 我必须通过对Room数据库的异步调用来更新UI,但是当我收到此错误时:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。
//收藏夹Presenter.kt
GlobalScope.launch {
favoritesView.showFavorites(ProductProvider.getAllProducts() as ArrayList<Product>)
}
Run Code Online (Sandbox Code Playgroud)
// ProductProvider.kt
fun getAllProducts() : MutableList<Product> {
return dao.getAllProducts()
}
Run Code Online (Sandbox Code Playgroud)
// ProductDao.kt
@Query("SELECT * FROM product")
fun getAllProducts(): MutableList<Product>
Run Code Online (Sandbox Code Playgroud)
我需要通过ProductProvider更新UI,因为我将对所有实体使用可靠的解决方案。
我想在普通函数中调用阻止暂停函数,但不阻止线程完成暂停函数,然后返回 Response
override fun intercept(chain: Interceptor.Chain): Response {
// getSession is a suspend function
val session = sessionProvider.getSession()
return chain.proceed(
chain
.request()
.newBuilder()
.addHeader("Authorization", "${session.token}")
.build()
)
}
Run Code Online (Sandbox Code Playgroud) 我在片段中使用lifecycleScope时遇到麻烦,我认为如果该片段脱离活动,则lifecycleScope将取消协程作业。
我已经阅读了lifecycleScope的代码,但我认为这不可能发生。我唯一能做的就是为此添加一个先决条件“ iFyre”。
private fun updateUserInfo(user: User) = lifecycleScope.launch {
textView.text = getString(R.string.foo)
}
Run Code Online (Sandbox Code Playgroud)
此代码抛出
java.lang.IllegalStateException androidx.fragment.app.Fragment.requireContext(Fragment.java:696)
我希望有人可以帮助我解释lifecycleScope的机制。