我正在调试从2个传感器收集信息的应用程序:网络摄像头和麦克风.
一般架构非常简单:
子进程和主进程处于无限循环中以处理命令(来自用户的主进程,来自主进程的子进程).
它在全球范围内有效,但我无法阻止子进程.
我已经记录了代码,它似乎发生了两件事:
该行为显然与连接状态相关联,因为没有发送任何内容的子进程没有此行为.不过,我还没有看到如何调试/修改当前可能合理的架构.
那么,是什么导致这种阻塞行为以及如何避免它呢?
这是为子进程中的无限循环的每次迭代执行的代码:
def do(self):
while self.cnx.poll():
msg = self.cnx.recv()
self.queue.append(msg)
#==
if not self.queue:
func_name = 'default_action'
self.queue.append([func_name, ])
#==
msg = self.queue.pop()
func_name, args = msg[0], msg[1:]
#==
res = self.target.__getattribute__(func_name)(*args)
#==
running = func_name != 'stop'
#==
if res and self.send:
assert running
self.output_queue.append(res[0])
if self.output_queue and running:
self.cnx.send(self.output_queue.popleft())
#==
return running
Run Code Online (Sandbox Code Playgroud)
更新:似乎管道不能同时写入两端.如果将上面代码的最后几行更改为:
if self.output_queue and running:
if not self.cnx.poll():
self.cnx.send(self.output_queue.popleft())
Run Code Online (Sandbox Code Playgroud)
问题仍然存在,但默认情况下管道被记录为全双工,并且根本没有记录此行为.我一定是误解了一些东西.拜托我吧!
更新2:为了清楚起见,在这种情况下没有关闭连接.描述事件的顺序:
我正在用pyside构建一个Qt应用程序,我有随机分段错误.我安装了faulthandler,如果不完整,则调用堆栈清除:
File "/home/lionel/Libs/python/ProcessGraph/process_graph/qtgraph.py", line 247 in itemChange
File "/home/lionel/Libs/python/ProcessGraph/process_graph/qtgraph.py", line 268 in mousePressEvent
File "/home/lionel/Libs/python/ProcessGraph/process_graph/qtgraph.py", line 87 in mousePressEvent
File "main.py", line 219 in main
File "main.py", line 223 in <module>
Run Code Online (Sandbox Code Playgroud)
崩溃总是在那里(在mousePressEvent中),但除了启动gdb之外,我没有看到我能从那里做什么.
我已经安装了python-gdb并尝试启动:gdb -ex r --args python-dbg main.py但它没有运行.所以我有点卡住了.这里的堆栈:
python2.7-dbg: ../Objects/object.c:65: _Py_AddToAllObjects: Assertion `(op->_ob_prev == ((void *)0)) == (op->_ob_next == ((void *)0))' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff6f09037 in raise ()
from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0 0x00007ffff6f09037 in raise ()
from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6f0c698 in abort ()
from …Run Code Online (Sandbox Code Playgroud) 我正在考虑下一个项目的总体架构.对于后端,haskell看起来非常合适,但不适用于前端,其中python会更好并且更容易编码.繁重的计算将在haskell中完成,结果显示在用python构建的gui中.
所以,我需要选择正确的管道和正确的格式来在这两个过程之间进行通信.
从python发送到haskell进程的消息非常简单,就像具有一些但不同值的文档一样.(我想可以使用json.)
但是从haskell到python进程的消息对于大(浮点)数组会更加沉重.这就是我需要更加小心的地方:无论使用哪种库,都需要在python中实现快速实现,并且在haskell中要相当稳定.
那么,有哪些选择?
Flask 代码库的一大复杂性是由于可以创建多个应用程序这一事实。虽然我掌握了允许这样做的架构,但我不太明白,它什么时候发生?或者为什么需要它?
需要明确的是,我不是在谈论蓝图。我正在谈论类似的事情:
from flask import Flask, Blueprint
bp = Blueprint('common', __name__)
@bp.route('/')
def index():
return 'Hello World!'
def make_app(filename):
app = Flask(__name__)
app.config.from_pyfile(filename)
app.register_blueprint(bp)
return app
app1 = make_app('config1.py')
app2 = make_app('config2.py')
Run Code Online (Sandbox Code Playgroud) 我正在QGraphicsView中构建节点图,我正在实现平移.我使用了以下问题" 如何在QGraphicsView中平移图像 ",但是平移受滚动条范围的限制.
我也尝试了翻译方法,但它给出了相同的结果.视图仅限于某个矩形.
我想无限制地平移,图形可以变得非常大,并且能够在场景的不同区域工作是有用的(这里有一个图形,那里有另一个图形等).
我的应用程序需要一个带有标题按钮的组合框.或等同的东西.
这是我的用例.
该应用程序读取数据结构并构建一个适当的面板.可以通过此属性面板添加/删除某些属性.
如果属性是终端,如字符串或整数,则该属性将表示为经典标签以及正确的小部件.我可以轻松地为此布局添加删除按钮.
但是如果属性更复杂并且本身具有一些子属性,则它表示为组合框.原始的QGroupBox只允许一个字符串作为标题,而我想在那里添加一个删除按钮.
我是QT的新手,可能会遗漏一些东西,任何想法?
在我的应用程序中,我有一个项目功能,但它需要一系列对话框才能工作.
开始时,用户必须打开现有项目或创建新项目,并且在创建新项目时,用户必须指定文件夹.
因此,在新项目或现有项目之间有一个第一个用于选择的对话框,另一个用于在新项目的情况下打开以选择文件夹.
现在,我在第一个上调用exec_()方法,并在里面做所有事情(创建第二个对话框,使用它,等等).直接后果:它使用副作用很麻烦.
所以问题是:在QT中可以干净地链接对话框吗?
我有两个数组,第一个是(n,2)数组,它包含数据池中选择的开始和结束,第二个是数据池.
一般的想法是使用第一个从第二个提取相关数据,但我不知道如何干净利落地使用numpy.
我找到了以下解决方案,但它看起来很笨拙:
relevant_data = datapool[np.arange(*selection[0])]]
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
更新:嵌套索引的能力是一个很大的优势(获得选择的子部分).