在C中,是否有一种很好的方法来跟踪枚举中的元素数量?我见过
enum blah {
FIRST,
SECOND,
THIRD,
LAST
};
Run Code Online (Sandbox Code Playgroud)
但这仅在项目是连续的并且从零开始时才有效.
我有一个XML文档通过套接字进入,我需要动态解析和响应(即解析部分树).我想要的是一种非阻塞方法,这样我就可以在等待更多数据进入时做其他事情(没有线程).
像iterparse这样的东西如果在读缓冲区为空时完成迭代将是理想的,例如:
context = iterparse(imaginary_socket_file_wrapper)
while 1:
for event, elem in context:
process_elem(elem)
# iteration of context finishes when socket has no more data
do_other_stuff()
time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
我猜SAX也是一个选择,但iterparse似乎对我的需求来说更简单.有任何想法吗?
更新:
使用线程很好,但引入了我希望回避的复杂程度.我认为非阻塞调用是一种很好的方法,但我发现它增加了解析XML的复杂性.
将应用程序从32位移动到64位时,会增加内存使用量?
我知道指针的大小会加倍,我怀疑字符串中的字符是"聚集"以更有效地使用内存(所以不会使用更多的内存).
内存使用量还会增加吗?有没有它会减少,或非算术运算会看到速度的好处?
有没有办法连接到Twisted Python的RFC2217网络串口?
Pyserial似乎通过该serial.serial_for_url("rfc2217://...")
功能支持它.并且它们表明twisted使用pyserial来管理串行连接,但是twisted.internet.serialport.SerialPort
似乎期望端口名称或数字表明它只是将它传递给serial.Serial
构造函数.
我可以使用socat在外部创建一个PTY并将dev名称传递给twisted,这很好,但是我想知道我是否可以通过直接使用pyserial支持来绕过这一步.
socat PTY,link=/dev/myport TCP:192.168.1.222:9001
Run Code Online (Sandbox Code Playgroud)
编辑:pyserial faq建议对实例化串行对象进行此修改:
try:
s = serial.serial_for_url(...)
except AttributeError:
s = serial.Serial(...)
Run Code Online (Sandbox Code Playgroud)
不确定这是否有帮助...
为什么我可以为一组添加正常的callables和方法,但不是<some list>.append
(例如)?
例如:
>>> l = []
>>> s = set()
>>> s.add(l.append)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> type(l.append)
<type 'builtin_function_or_method'>
>>> type(map)
<type 'builtin_function_or_method'>
>>> s.add(map)
>>> def func(): print 'func'
...
>>> s.add(func)
>>> print s
set([<built-in function map>, <function func at 0x10a659758>])
Run Code Online (Sandbox Code Playgroud)
编辑:我注意到这l.append.__hash__()
也给出了这个错误