有没有办法在python中的流上使用正则表达式匹配?喜欢
reg = re.compile(r'\w+')
reg.match(StringIO.StringIO('aa aaa aa'))
Run Code Online (Sandbox Code Playgroud)
我不想通过获取整个字符串的值来做到这一点.我想知道是否有任何方法可以在srtream(即时)上匹配正则表达式.
我最近一直在使用烧瓶在python中开展宠物项目.它是一个简单的pastebin,具有服务器端语法高亮支持pygments.因为这是一项代价高昂的任务,所以我将语法高亮显示委托给芹菜任务队列,并在请求处理程序中等待它完成.毋庸置疑,这只不过是减轻了对其他工作者的CPU使用率,因为等待结果仍会锁定与Web服务器的连接.尽管我的直觉告诉我要避免像瘟疫这样的过早优化,但我仍然无法帮助自己避免异步.
异步
如果最近一直关注python web开发,你肯定已经看到异步无处不在.异步的作用是带回合作多任务,这意味着每个"线程"决定何时何地屈服于另一个.这种非抢占式进程比OS线程更有效,但仍有其缺点.目前似乎有两种主要方法:
第一个通过在事件循环中执行的松散耦合组件提供并发性.尽管这在竞争条件方面更安全并且提供了更高的一致性,但与先发制人的多任务处理相比,它更不直观且更难编码.
另一个是更传统的解决方案,更接近线程编程风格,程序员只需手动切换上下文.虽然更容易出现竞争条件和死锁,但它提供了一个简单的插入式解决方案.
目前大多数异步工作都是在所谓的IO绑定任务上完成的,这些任务阻塞等待输入或输出.这通常通过使用可以调用的轮询和基于超时的函数来完成,如果它们返回负值,则可以切换上下文.
尽管名称,这也可以应用于CPU绑定任务,可以委托给另一个工作者(线程,进程等),然后非阻塞地等待产生.理想情况下,这些任务将以异步友好的方式编写,但实际上这意味着将代码分成足够小的块而不是阻塞,最好不要在每行代码之后分散上下文切换.这对于现有的同步库尤其不方便.
由于方便,我决定使用gevent进行异步工作,并想知道如何在异步环境中处理CPU绑定任务(使用期货,芹菜等?).
如何在传统的Web框架(例如flask)中使用异步执行模型(在本例中为gevent)?在python(期货,任务队列)中,这些问题有哪些常见的解决方案?
编辑:更具体 - 如何使用gevent与烧瓶以及如何在这种情况下处理CPU绑定的任务?
编辑2:考虑到Python如何使GIL阻止线程代码的最佳执行,这至少只留下了多处理选项.这意味着要么使用concurrent.futures,要么使用其他一些处理处理的外部服务(甚至可以为语言不可知的事情打开大门).在这种情况下,什么会是一些流行或经常使用gevent(即芹菜)的解决方案? - 最佳做法
我想通过说它与范式相关而开始这个问题,我只想澄清一些概念.所以我已经用Python编程了大约两年了,把我的脚趾浸入Java但不是太多,我想深入研究C++.我之前使用过它,但不适用于涉及大量设计的大型项目.
当我第一次开始探索它时,我相信它与Java类似地解决了OOP,其中所有东西都必须实现一个接口.然后我碰到了模板的概念,我立即将其作为一种解决方法,为原型(整数,浮点数)提供多态性行为,而这些原语并没有实现它(基本上是Python通过鸭子输入而没有形式接口).但我很快发现模板用于为非原始类型提供相同的行为.
所以我的问题是:在模板中使用经典多态性的原因是什么,在C++社区中这是什么一般方法?
编辑刚刚发现这几乎解决了这个问题(静态多态性确实需要围绕这个术语).
尝试使用DASK是read_csv对文件,其中大熊猫的read_csv这样
dd.read_csv('data/ecommerce-new.csv')
Run Code Online (Sandbox Code Playgroud)
失败并显示以下错误:
pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at line 2
Run Code Online (Sandbox Code Playgroud)
该文件是使用scrapy包含两列的csv文件,其中csv具有两列,一列包含url,另一列包含html(使用多行存储"为定界符char)。实际上,被熊猫解析意味着它应该被正确格式化。
html,url
https://google.com,"<a href=""link"">
</a>"
Run Code Online (Sandbox Code Playgroud)
使sample参数足够大以将整个文件加载到内存中似乎可以正常工作,这使我相信在尝试推断数据类型时它实际上会失败(还有这个问题应该已经解决了https://github.com/dask/dask / issues 1284)
有人遇到过这个问题吗?有修复/解决方法吗?
编辑:显然,如果文件在引号之间包含换行符,这是dask的read_csv的已知问题。我发现的一个解决方案是简单地在内存中读取所有内容:
dd.from_pandas(pd.read_csv(input_file), chunksize=25)
Run Code Online (Sandbox Code Playgroud)
这行得通,但要以并行度为代价。还有其他解决方案吗?
基本上,我有一个父进程,它分叉一个子进程并通过管道将它的 stdin 提供给它。子进程可以在以下两种情况之一终止:
我的父代码大致如下所示:
close(pi[0]); // close input end
signal(SIGPIPE, SIG_IGN); // do not handle SIGPIPE
char buffer;
int ok = 1;
while(ok && read(STDIN_FILENO, &buffer, 1) > 0) {
int b_written = write(pi[1], &buffer, 1);
if(b_written == -1) {
if(errno == EPIPE) ok = 0;
else perror("pipe write"); // some other error
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我通过检查errno == EPIPE. 然而,这意味着读取循环在关闭之前会进行一次额外的迭代。我怎么可能轮询以查看管道是否已关闭而不必对其进行写入?