我不熟悉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对象.我认为这可能是浪费.那么,在线程中全局使用单个数据库对象是否可以?
......每个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.
编辑.
我的问题的实质是更清洁的中继在这个问题 (感谢链接尼克拉斯)
扫描urllib2源后,即使您指定keep-alive,似乎连接也会自动关闭.
为什么是这样?
因为它现在我只是httplib用于我的持久连接...但想知道为什么在urllib2中禁用(或者可能只是模糊).
我们使用基于BaseHTTPServer的基本python日志服务器来聚合ubunutu服务器上的python日志.这个解决方案满足了我们的需求......直到现在.转储到此日志服务器的程序数量已经增加,现在记录器正在削弱系统.
现在我们回到绘图板,我们正在考虑使用syslog.
使用syslog而不是其他日志设备是否有利.
谢谢您的帮助
使用urllib2,我们能够使用"GET"或"POST"以外的方法(提供数据时)吗?
我挖到了库中,似乎使用GET或POST的决定"方便"与请求中是否提供数据有关.
例如,我想与CouchDB数据库进行交互,这需要诸如'DEL','PUT'之类的方法.我想要urllib2的处理程序,但需要自己进行方法调用.
我不希望将第三方模块导入我的项目,例如CouchDB python api.所以,请不要走那条路.我的实现必须使用python 2.6附带的模块.(我的设计规范要求使用准系统PortablePython发行版).在导入外部模块之前,我会使用httplib编写自己的接口.
非常感谢你的帮助
最近在工作中需要python命令行实用程序,我没有编写cli的经验.无论如何,我仍然必须将它们弹出.
我最大的障碍是这些计划的结构.此外,获取和验证来自用户的输入的方法.我一直在以非常宽松的循环结束,我只是不认为这是最有效的方法.
有人可以提供我可能选择的开源cli程序的链接以获得一些理解吗?或者,我可以得到的书籍,教程等.我已经挖了但没有成功(我的谷歌技能必须缺乏).
我试图从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)