小编sba*_*ell的帖子

asyncore回调启动线程......好吗?

我不熟悉asyncore,并且对异步编程的知识非常有限,除了一些扭曲的教程介绍.

我最熟悉线程并在我的所有应用程序中使用它们.一个特定的应用程序使用couchdb数据库作为其接口.这涉及对数据库进行longpolling以寻找更改和更新.我用于couchdb的模块是couchdbkit.它使用asyncore循环来监视这些更改并将它们发送到回调.

所以,我从这个回调中发现了我启动工作线程的地方.混合异步和线程编程似乎有点粗糙.我真的很喜欢couchdbkit,但不想在我的程序中引入问题.

所以,我的问题是,从异步回调中触发线程是否安全?

这是一些代码......

def dispatch(change):
    global jobs, db_url # jobs is my queue
    db = Database(db_url)
    work_order = db.get(change['id']) # change is an id to the document that changed. 
                                  # i need to get the actual document (workorder)

    worker = Worker(work_order, db) # fire the thread
    jobs.append(worker)
    worker.start()
    return


main()
.
.
.

consumer.wait(cb=dispatch, since=update_seq, timeout=10000) #wait constains the asyncloop.
Run Code Online (Sandbox Code Playgroud)

更新:

在仔细研究了这个之后,我还有一个关于couchdbkit大师的问题.使用该数据库可能有数百个线程.正如您在我的代码示例中所看到的,我正在为每个线程实例化一个couchdbkit.Database对象.我认为这可能是浪费.那么,在线程中全局使用单个数据库对象是否可以?

python multithreading couchdb asyncore

9
推荐指数
1
解决办法
919
查看次数

我发现自己摆动了列表理解锤

......每个for-loop看起来都像列表理解.

代替:

for stuff in all_stuff:
    do(stuff)
Run Code Online (Sandbox Code Playgroud)

我在做(没有将列表分配给任何东西):

[ do(stuff) for stuff in all_stuff ]
Run Code Online (Sandbox Code Playgroud)

这是list-comp方法的常见模式.1)好的,没什么大不了的?错误. 2) 这不能只是代码风格吗?超级错了.

1)是的,这是错的.正如NiklasB所指出的那样,HowTos的目标是建立一个新的列表.

2)也许,但它不明显和明确,所以最好不要使用它.

我没有记住那些操作方法基本上是基于命令行的.在我的团队向我大吼之后,想知道为什么我要建立大量的列表然后让它们离开,我突然意识到我可能会引入一个与内存相关的重大错误.

所以这是我的问题.如果我是在一个长时间运行的过程中这样做的,那里正在消耗大量数据,那么这个"列表"会继续消耗我的内存直到放手吗?垃圾收集器什么时候会回忆起内存?内置此列表之后是​​否已丢失?

我的猜测是肯定的,它会继续消耗我的记忆力.我不知道python垃圾收集器是如何工作的,但我冒昧地说这个列表将存在,直到next调用最后一个all_stuff.

编辑.

我的问题的实质是更清洁的中继在这个问题 (感谢链接尼克拉斯)

python list-comprehension

8
推荐指数
1
解决办法
313
查看次数

为什么URLLib2不支持持久连接?

扫描urllib2源后,即使您指定keep-alive,似乎连接也会自动关闭.

为什么是这样?

因为它现在我只是httplib用于我的持久连接...但想知道为什么在urllib2中禁用(或者可能只是模糊).

python urllib2 keep-alive

7
推荐指数
1
解决办法
3495
查看次数

使用syslog而不是其他日志设备有什么好处?

我们使用基于BaseHTTPServer的基本python日志服务器来聚合ubunutu服务器上的python日志.这个解决方案满足了我们的需求......直到现在.转储到此日志服务器的程序数量已经增加,现在记录器正在削弱系统.

现在我们回到绘图板,我们正在考虑使用syslog.

使用syslog而不是其他日志设备是否有利.

谢谢您的帮助

python logging syslog

5
推荐指数
1
解决办法
2290
查看次数

python urllib2中的自定义方法

使用urllib2,我们能够使用"GET"或"POST"以外的方法(提供数据时)吗?

我挖到了库中,似乎使用GET或POST的决定"方便"与请求中是否提供数据有关.

例如,我想与CouchDB数据库进行交互,这需要诸如'DEL','PUT'之类的方法.我想要urllib2的处理程序,但需要自己进行方法调用.

我不希望将第三方模块导入我的项目,例如CouchDB python api.所以,请不要走那条路.我的实现必须使用python 2.6附带的模块.(我的设计规范要求使用准系统PortablePython发行版).在导入外部模块之前,我会使用httplib编写自己的接口.

非常感谢你的帮助

python methods urllib2

3
推荐指数
1
解决办法
1709
查看次数

python命令行编程实例,食谱

最近在工作中需要python命令行实用程序,我没有编写cli的经验.无论如何,我仍然必须将它们弹出.

我最大的障碍是这些计划的结构.此外,获取和验证来自用户的输入的方法.我一直在以非常宽松的循环结束,我只是不认为这是最有效的方法.

有人可以提供我可能选择的开源cli程序的链接以获得一些理解吗?或者,我可以得到的书籍,教程等.我已经挖了但没有成功(我的谷歌技能必须缺乏).

python command-line-interface

3
推荐指数
1
解决办法
1746
查看次数

从ifconfig(ubuntu)中提取网络信息的算法

我试图从ifconfig(ubuntu)解析信息.通常,我会将这样的数据块分成单词,然后搜索子字符串以获得我想要的内容.例如,给定line = "inet addr:192.168.98.157 Bcast:192.168.98.255 Mask:255.255.255.0",并寻找广播地址,我会这样做:

for word in line.split():
    if word.startswith('Bcast'):
        print word.split(':')[-1]

>>>192.168.98.255
Run Code Online (Sandbox Code Playgroud)

但是,我觉得有时间开始学习如何使用正则表达式来完成这样的任务.到目前为止,这是我的代码.我已经破解了几种模式(inet addr,Bcast,Mask).代码后的问题......

# git clone git://gist.github.com/1586034.git gist-1586034
import re
import json

ifconfig = """
eth0      Link encap:Ethernet  HWaddr 08:00:27:3a:ab:47  
          inet addr:192.168.98.157  Bcast:192.168.98.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe3a:ab47/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:189059 errors:0 dropped:0 overruns:0 frame:0
          TX packets:104380 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:74213981 (74.2 MB)  TX bytes:15350131 (15.3 MB)\n\n
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 …
Run Code Online (Sandbox Code Playgroud)

python regex

3
推荐指数
2
解决办法
1万
查看次数