小编nik*_*tiu的帖子

Python正则表达式解析流

有没有办法在python中的流上使用正则表达式匹配?喜欢

reg = re.compile(r'\w+')
reg.match(StringIO.StringIO('aa aaa aa'))
Run Code Online (Sandbox Code Playgroud)

我不想通过获取整个字符串的值来做到这一点.我想知道是否有任何方法可以在srtream(即时)上匹配正则表达式.

python regex stream

27
推荐指数
2
解决办法
6630
查看次数

Python异步和CPU绑定任务?

我最近一直在使用烧瓶在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 asynchronous gevent flask

14
推荐指数
1
解决办法
3375
查看次数

C++模板(泛型编程)与多态?

我想通过说它与范式相关而开始这个问题,我只想澄清一些概念.所以我已经用Python编程了大约两年了,把我的脚趾浸入Java但不是太多,我想深入研究C++.我之前使用过它,但不适用于涉及大量设计的大型项目.

当我第一次开始探索它时,我相信它与Java类似地解决了OOP,其中所有东西都必须实现一个接口.然后我碰到了模板的概念,我立即将其作为一种解决方法,为原型(整数,浮点数)提供多态性行为,而这些原语并没有实现它(基本上是Python通过鸭子输入而没有形式接口).但我很快发现模板用于为非原始类型提供相同的行为.

所以我的问题是:在模板中使用经典多态性的原因是什么,在C++社区中这是什么一般方法?

编辑刚刚发现几乎解决了这个问题(静态多态性确实需要围绕这个术语).

c++ oop templates

6
推荐指数
1
解决办法
6254
查看次数

在没有熊猫的情况下,dask read_csv失败

尝试使用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)

这行得通,但要以并行度为代价。还有其他解决方案吗?

python pandas dask

6
推荐指数
1
解决办法
973
查看次数

检查 unix 管道是否关闭而不写入任何内容?

基本上,我有一个父进程,它分叉一个子进程并通过管道将它的 stdin 提供给它。子进程可以在以下两种情况之一终止:

  • 管道的写端被父进程关闭,这意味着它到达了 stdin 的末尾,从而接收到一个EOF
  • 或者它通过管道接收某个输入(在这种情况下为-1)并退出

我的父代码大致如下所示:

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. 然而,这意味着读取循环在关闭之前会进行一次额外的迭代。我怎么可能轮询以查看管道是否已关闭而不必对其进行写入?

c unix pipe process

5
推荐指数
2
解决办法
2531
查看次数

标签 统计

python ×3

asynchronous ×1

c ×1

c++ ×1

dask ×1

flask ×1

gevent ×1

oop ×1

pandas ×1

pipe ×1

process ×1

regex ×1

stream ×1

templates ×1

unix ×1