关于yield实现异步的原理
发布于 9 年前 作者 wenshiqi0 7609 次浏览 最后一次编辑是 8 年前 来自 问答

我个人的感觉是从python的yield来的,会在yield这里停止住 外部使用迭代器的next就可以运行yield 但是它是如何实现异步的呢

7 回复

不,ruby里也有。。。。

@i5ting 我不是说这个东西来自python 只是我第一接触是从python里面来的 我不清楚它是怎么实现异步 通过分解任务嘛

Generator是为JavaScript设计的一种轻量级的协程。它通过yield关键字,可以控制一个函数暂停或者继续执行Generator函数有一个特别的语法function* (),借助这种超能力,我们还可以暂停或者继续执行异步操作,使用像promise或者”thunks”这样的结构来写出看起来像同步的代码。

@i5ting 我好像明白了 我去试试代码 谢谢

@i5ting我试试了的 但是我个人觉得 在tj的代码里面看了 我个人觉得 它是反复的在函数内部执行next 从而达到不阻塞主线程的目的

@wenshiqi0 express 和koa是不一样的处理方式

next是connect中间件里的

@i5ting

回调在异步领域退出前台是必然的。

javascript对协程还是遮遮掩掩的,这种设计其实很不好,不伦不类。但也可以理解,javascirpt有历史包袱,有太多的回调代码需要兼容,node又是整个建立在回调基础上的,用node的人还要坚持两三年啊。

协程肯定是比回调对编程更友好的,经过适当的处理,回调就可以通过协程转化为形式同步。在c层面可以继续存在回调,也是在c层面实现回调转换,每个连接开启一个协程,回调返回唤醒协程,返回数据,将来的异步代码就是这个样子的。

server.lua


local tcp = require('tcp')
local onconnect = require('onconnect')

local options = {
	host: 127.0.0.1,
	port: 8080,
	onconnect : onconnect,
}

tcp.createServer(options);


onconncet.lua

local redis = require('redis')

local function onconnect(socket, server)
	while true do
		local length = 100
		local data, err = socket:read(length)
		if err do
			print(err.message)
			socket:close()
			break
		end
	
		local rc, err = redis:connect('127.0.0.1', 8000)
		if err do
		end
		
		local ret, err = rc:get('test')
		if err do
		end
		
		msg = data..ret
		
		-- 下次异步操作就会启动超时检测,超时就会返回超时错误
		socket:setTimeout(10)
		
		local len, err1 = socket:write(msg)
		if err1 do
			print(err1.message)
			socket:close()
			break
		end
		
		local data1, err = socket:read(156)
		if err do
			socket:close()
			break
		end
	end
end

回到顶部