Articles of asynchronous

在Linux中阻塞多个线程的read()和write()

我有一个需要从键盘和鼠标读取的Linux进程。 在做一些主要的过程的时候,它需要asynchronous地做到这一点。 我提出的实现是在一个线程中拥有主进程,并且有两个独立的线程总是从键盘和鼠标读取()。 如果Linux read()被阻塞,当主线程继续执行(我想要的)时,键盘和鼠标线程是否会被阻塞,或者整个过程会被阻塞?

实现与gevent兼容的工作进程池的最佳方式是什么?

脚本 我有一个在Python和gevent中实现的服务器进程,它通过TCP / IP连接到后端服务,并为许多Web客户端(每个进程约1000个)提供服务,并根据后端服务提供的更改快速更改dynamic内容。 该服务在Ubuntu 10.04上运行,不会在Windows上运行,因此目标平台已经修复。 目前我们正在使用Python 2.6.6。 问题 将更改提供给多个客户端可能会导致处理后端发送的更改滞后,因此我的计划是将服务器分成多个进程。 许多工作进程将为Web客户端服务,而主进程仍将连接到后端服务。 我已经使用一个单独的greenlet池来为Web客户端服务,但是他们需要被放入工作进程。 题 您可以请我指出一个gevent的工作进程池实现,或者找出如何以正确的方式使用Python自己的多处理模块? 限制 我想避免在我们的进程中引入Python线程,因为这会给GIL争用留出空间,从而通过引入延迟来降低性能。 所以如果可能的话,这将是一个干净的多处理+ gevent解决scheme。

Linux中的asynchronous定时器

我想使用一个asynchronous定时器,当它到期时触发一个callback函数。 我想要微秒的精度。 我的代码stream是这样的.. timer_t tid; struct itimerspec val; val.it_value.tv_sec = 0; val.it_value.tv_nsec = 100000; value.it_interval.tv_sec = 0; value.it_interval.tv_nsec = 100000; timer_create (CLOCK_REALTIME, NULL, &tid); timer_connect (tid, myfunc,0); timer_settime (tid, 0, &val, NULL); and write my handle function: myfunc(){ blah blah blah… } 我认为timer_connect在最近的Linux版本中没有被使用过..我有另一种方法吗? 谢谢,

中断当前正在执行的所有asyncio.sleep

哪里 这是在Linux,Python 3.5.1上。 什么 我正在用asyncio开发一个监视器进程,在各个地方的任务await asyncio.sleep调用各种持续时间。 有些时候,我希望能够中断所有的asyncio.sleep调用,并让所有任务正常进行,但我找不到如何做到这一点。 一个例子是正常closures监视器进程。 如何(失败的假设) 我认为我可以发送一个ALRM信号,但是这个过程会死亡。 我试图捕捉ALRM信号: def sigalrm_sent(signum, frame): tse.logger.info("got SIGALRM") signal.signal(signal.SIGALRM, sigalrm_sent) 然后我得到有关捕获SIGALRM的日志行,但是asyncio.sleep调用不会中断。 (kludge) 在这一点上,我将所有的asyncio.sleep调用replace为这个协程的调用: async def interruptible_sleep(seconds): while seconds > 0 and not tse.stop_requested: duration = min(seconds, tse.TIME_QUANTUM) await asyncio.sleep(duration) seconds -= duration 所以我只需要选一个不算小也不要太大的TIME_QUANTUM 。 但 有没有办法中断所有正在运行的asyncio.sleep调用,我错过了?

打开Linux(path,O_NONBLOCK | O_RDONLY | O_DIRECT)会阻止文件上的pread

我想在我的程序中读取asynchronous磁盘。 服务器上有很多硬盘,如果一个硬盘慢,程序被阻塞。 我想打电话asynchronous。 如果我打电话: 打开(path,O_NONBLOCK | O_RDONLY | O_DIRECT) 然后pread,然后pread使用高达8000微秒,但阻止我的程序。 是否有可能启用asynchronous磁盘读取没有线程池?

C ++:std :: async和std :: mutex在Linux上导致死锁,但在Windows上运行?

我刚刚编译了一个在Windows下用于Linux的项目,发现它在某个时刻挂起。 因为我使用std :: async和std :: mutex我的第一个假设是,它可能是一个死锁问题。 不过,我不知道为什么它在Windows上运行良好。 这里是代码: void BorderExtractor::preprocessImageAsync(const PreprocessingSettings& settings) { _preprocessingMutex.lock(); if (!_preprocessingActive) { _preprocessingActive = true; std::async(std::launch::async, &BorderExtractor::preprocessImage, this, settings); //this point is never reached on linux _preprocessingUpToDate = true; } else { _cachedSettings = settings; _preprocessingUpToDate = false; } _preprocessingMutex.unlock(); } 这是在Linux下永远不会返回的函数。 它运行,直到asynchronous调用,然后停止。 它几乎看起来好像该函数不是asynchronous启动的,程序等待它返回,什么都不起作用,因为另一个函数会试图locking相同的互斥量。 这是asynchronous调用的函数: void BorderExtractor::preprocessImage(PreprocessingSettings settings) { //here […]

从信号处理程序中调用非asynchronous安全函数时是否总是不安全?

我只是搞清楚我是否可以在信号处理程序中调用非asynchronous安全函数。 来自Linux手册页的信号(7): 如果一个信号中断了一个不安全的函数的执行,并且处理程序调用了一个不安全的函数,那么程序的行为是不确定的 。 和TLPI : SUSv3指出,表21-1(asynchronous安全函数列表)中未列出的所有函数都被认为对信号不安全,但指出只有在调用信号处理程序中断执行一个函数时,函数才是不安全的不安全的函数 ,处理程序本身也调用一个不安全的函数 。 我对上述引号的解释是, 只有在信号处理程序没有中断非asynchronous安全函数的情况下,才可以从信号处理程序调用非asynchronous安全函数 。 例如,我为SIGINT安装了一个处理程序,它调用一个不安全的函数,假设它是不可重入的crypt(3) ,即不安全的。 sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sa.sa_handler = handler; sigaction(SIGINT, &sa, NULL); 而且我也在printf()的无限循环中调用printf() ,并且只有主线程在运行。 问题是,对于这个简单的例子,当处理程序中断printf()的执行并且调用一个不安全的函数时,我没有看到任何不好的事情发生。 AFAK, printf()将获得一个控制台锁,并有一个内部缓冲区来执行缓冲的I / O,但是在这个例子中它的状态是一致的 。 虽然crypt()返回一个静态分配的string,但它不会与其他函数或线程共享。 我误解了什么? 我希望有人澄清一下,如果信号处理程序中断了主程序中的不安全函数的执行,并且本身也调用了不安全的函数,或者在某些情况下这样做是安全的(例如上面的简单示例) ?

如何检测空的epoll集

我正在学习使用epoll,并且写了下面的例子 #include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <sys/epoll.h> #include <unistd.h> int main() { int epfd; struct epoll_event ev; struct epoll_event ret; char buf[200]; int n,k,t; epfd = epoll_create(100); assert(0 == fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK) ); ev.data.fd = 0; ev.events = EPOLLIN | EPOLLET; if(epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &ev) != […]

ALSAasynchronouscallback?

ALSA文档似乎很缺乏…基本上,我需要asynchronous播放声音,能够停止(所有)声音,并成功完成播放时获得callback。 我可以主要做前2,而后者我有麻烦。 有没有人知道任何可以启发我的片段? 更多细节: 基本上,用户将浏览一组声音,当他们hover在一个,它应该播放,当他们走到下一个,那个应该停止很快,下一个应该播放等….这将发生得很快。 最后一个他们听到的整体应该被选中(因此,为什么我需要callback,如果整个声音播放成功,因为atmselect不一定是他们最less听到,由于线程) 我真的不想使用libasound以外的任何库。

套接字读取与文件读取有什么不同?

我只是打算重写一些python代码,我在轮询一个文件的变化。 我想重写它asyncio的练习和概念的想法是做一个非阻塞的文件读取会产生。 一旦数据可用,事件循环将继续执行协程。 然后我发现asynchronous文件操作不是一个人做的事情。 REF。 但是我不明白这个行为的动机是什么,为什么它和套接字不一样。 sockets示例: 从协程读取套接字,直到数据准备就绪。 就绪意味着它实际上是从互联网上某个不确定的时间到达的。 为什么不读取文件: 从协程读取文件,直到数据准备就绪。 就绪意味着它实际上是从计算机硬盘的某个地方到达一个不确定的时间 这是来自遗留代码的inheritance行为,阻塞调用的效果不错吗? 这与Character vs Block文件有关吗? 字符设备文件怎么样,说一个代表UART连接的文件? 没有文件IO也可以在这里应用?