这是我正在研究的一些代码的简化版本:
void
stuff(int fd)
{
int ret1, ret2;
char buffer[32];
ret1 = recv(fd, buffer, 32, MSG_PEEK | MSG_DONTWAIT);
/* Error handling -- and EAGAIN handling -- would go here. Bail if
necessary. Otherwise, keep going. */
/* Can this call to recv fail, setting errno to EAGAIN? */
ret2 = recv(fd, buffer, ret1, 0);
}
Run Code Online (Sandbox Code Playgroud)
如果我们假设第一次调用recv成功,返回1到32之间的值,是否可以安全地假设第二次调用也会成功?ret2能否小于ret1?在哪些情况下?
(为了清楚起见,假设在第二次调用recv期间没有其他错误条件:没有传递信号,它不会设置ENOMEM等.还假设没有其他线程会查看fd.
我在Linux上,但我相信MSG_DONTWAIT是这里唯一的Linux特有的东西.假设之前在其他平台上设置了正确的fnctl.)
Celery包含一个能够使用amqp或其他一些芹菜后端发出异步HTTP请求的模块.我正在使用tornado-celery生产者进行异步消息发布.据我所知,龙卷风芹菜使用鼠兔为此.问题是如何使celery.task.http.URL适应龙卷风(使其无阻塞).基本上有两个地方需要改进:
HttpDispatch.make_request() 必须使用tornado async http客户端实现;URL.get_async(**kw)或者URL.post_async(**kw)必须使用tornado API重新实现相应的非阻塞代码.例如:
class NonBlockingURL(celery.task.http.URL):
@gen.coroutine
def post_async(self, **kwargs):
async_res = yield gen.Task(self.dispatcher.delay,
str(self), 'POST', **kwargs)
raise gen.Return(async_res)
Run Code Online (Sandbox Code Playgroud)但我无法理解如何以恰当和简洁的方式做到这一点.如何使其完全像非异步的非阻塞?顺便说一句,我正在使用amqp后端.
请给我一个很好的指导,甚至更好,一个例子.
我正在尝试编写一个响应的短(一个文件pyqt)程序(因此python/lxml/qt之外的依赖关系,特别是那些我不能只是坚持在文件中的这个用例有一些缺点但我可能仍然是愿意尝试他们).我正在尝试在工作线程上执行可能冗长(和可取消)的操作(实际上后台操作有一个锁定它以防止一次多个操作(因为它使用的库一次只能使用一个调用)和产生多个线程的超时也没问题.
据我所知,用qt做这个的"基本"方法是.(注意代码未经过测试,因此可能出错)
class MainWindow(QWidget):
#self.worker moved to background thread
def initUI(self):
...
self.cmd_button.clicked.connect(self.send)
...
@pyqtslot()
def send(self):
...
...#get cmd from gui
QtCore.QTimer.singleShot(0, lambda : self.worker(cmd))
@pyqtslot(str)
def end_send(self, result):
...
...# set some gui to display result
...
class WorkerObject(QObject):
def send_cmd(self, cmd):
... get result of cmd
QtCore.QTimer.singleShot(0, lambda: self.main_window.end_send())
Run Code Online (Sandbox Code Playgroud)
(我是否正确使用QTimer(它在不同的线程上运行)?)
我真的更喜欢在c#的异步中使用更简单,更抽象的东西.(注意我没有使用asyncio,所以我可能会遇到一些问题)
class MainWindow(QWidget):
...
@asyncio.coroutine
def send(self):
...
...#get cmd from gui
result = yield from self.worker(cmd)
#set gui textbox to result
class WorkerObject(QObject):
@asyncio.coroutine
def send_cmd(self, …Run Code Online (Sandbox Code Playgroud) 我要去ASK并回答我认为对MS Access中一些很酷的UI功能感兴趣的人有用的问题. 回答自己的问题
问题: 如何在Microsoft Access中显示非阻塞"吐司"之类的通知?确实有一些动画,不应该阻止主机应用程序!
我最近一直在玩其他框架,比如NodeJS.
我喜欢返回响应的可能性,并且仍然能够进行进一步的操作.
例如
def view(request):
do_something()
return HttpResponse()
do_more_stuff() #not possible!!!
Run Code Online (Sandbox Code Playgroud)
也许Django已经提供了一种在返回请求后执行操作的方法,如果情况很好的话.
非常感谢帮助!= d
我已经在无锁队列上的单个生产者/消费者上完成了我的基本实现,并且运行良好.但是,当我尝试将其扩展到多个生产者/消费者时,我开始遇到冲突.我通过SO发现了一个与此问题相关的类似帖子(对于多个读取或写入线程,是否存在无锁队列?)我发现一篇文章在原始实现上更进一步.我也对这篇希望得到一些指导的文章感到困惑.
第一个是这个实现在使用多个生产者/消费者时是否真的有用,或者在原始的Michael-Scott实现中缺少某些与多个生产者/消费者设置一起工作的东西.
第二个是文章" 无锁FIFO队列的乐观方法", Dequeue部分显示了虚拟值的使用.如何确定要使用的适当值?如果我使用整数,那么我会确定我为虚拟值选择的整数不是我决定排队的实际值吗?
任何建议或总体方向都会很棒.如果有人想知道我在Visual Studio中创建它以更好地理解非阻塞算法.我想尽可能地使它成为通用的,以便我可以排队所需的任何内容(队列中的数据是模板化的,因此用户可以指定要排队的内容).
新手对Node的理解是,如果我重写同步或内联代码来利用函数/回调,我可以确保我的代码是非阻塞的.我很好奇这是如何在事件堆栈方面工作的.这里的简单示例:不了解回调 - Stackoverflow是否会阻止:
var post = db.query("select * from posts where id = 1");
doSomethingWithPost(post)
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
虽然这不会:
callback = function(post){
doSomethingWithPost(post)
}
db.query("select * from posts where id = 1",callback);
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
好的,我知道我们应该使用回调.但就事件堆栈而言,为什么这样做呢?Javascript是单线程..在第一个示例行中,一个使用昂贵的阻塞I/O操作.在第一行完成之前,第2行无法执行.这是因为第2行需要第1行的信息吗?或者是因为I/O事件只是从根本上阻止了操作,这意味着他们抓住了控制权并且在完成之前不再回复...
在第二个例子中,昂贵的I/O已被移动到一个函数中,我们现在有一个回调函数.当然,在完成I/O之前,回调不能执行.这不会改变.因此,执行1到2之间所需的时间差异必须主要是第二个请求到达服务器时会发生的情况.
如果第二个请求遇到示例一,它将无法处理,直到请求1由于阻塞操作而完成..但在示例二中..将操作移动到函数中会自动生成子进程或充当多线程?如果Javscript是单线程的,那么除非有某种方式进行并行处理,否则这仍然会产生问题.如果我们使用非阻塞技术(如子进程等),函数/回调是否仅保证是非阻塞的. .
Node.JS最大的优点是它具有非阻塞性.它是单线程的,因此不需要为每个新的传入连接生成一个新线程.
在事件循环(实际上是单线程)后面,有一个"非阻塞工作者".这个东西不再是单线程了,所以(据我所知)它可以为每个任务生成一个新线程.
也许我误解了一些东西,但究竟哪里有优势.如果要处理的任务很多,那么非阻塞工作会不会变成阻塞工作者?
谢谢Christian