小编LBa*_*ret的帖子

什么可以使connection.send()块?(来自conn1,conn2 = multiprocessing.Pipe())

我正在调试从2个传感器收集信息的应用程序:网络摄像头和麦克风.

一般架构非常简单:

  • 主进程通过管道将消息(start,stop,get_data)发送到子进程(每个进程一个).
  • 子进程收集数据并将其发送到主进程

子进程和主进程处于无限循环中以处理命令(来自用户的主进程,来自主进程的子进程).

它在全球范围内有效,但我无法阻止子进程.

我已经记录了代码,它似乎发生了两件事:

  1. 发送'stop'消息但是没有通过管道.
  2. 子进程继续发送数据和conn.send(数据)块.

该行为显然与连接状态相关联,因为没有发送任何内容的子进程没有此行为.不过,我还没有看到如何调试/修改当前可能合理的架构.

那么,是什么导致这种阻塞行为以及如何避免它呢?

这是为子进程中的无限循环的每次迭代执行的代码:

    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:为了清楚起见,在这种情况下没有关闭连接.描述事件的顺序:

  • 主进程发送一个消息("停止")(它在发送消息之前清空连接)
  • 主进程进入一个(无限)循环,在子进程终止时停止.
  • 同时,子进程在发送中被阻止,永远不会收到消息.

python pipe multiprocessing

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

如何调试virtualenv中的pyside分段错误?

我正在用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)

python debugging gdb virtualenv pyside

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

什么是在python和haskell进程之间进行通信的ipc库?

我正在考虑下一个项目的总体架构.对于后端,haskell看起来非常合适,但不适用于前端,其中python会更好并且更容易编码.繁重的计算将在haskell中完成,结果显示在用python构建的gui中.

所以,我需要选择正确的管道和正确的格式来在这两个过程之间进行通信.

从python发送到haskell进程的消息非常简单,就像具有一些但不同值的文档一样.(我想可以使用json.)

但是从haskell到python进程的消息对于大(浮点)数组会更加沉重.这就是我需要更加小心的地方:无论使用哪种库,都需要在python中实现快速实现,并且在haskell中要相当稳定.

那么,有哪些选择?

python architecture haskell ipc

6
推荐指数
2
解决办法
951
查看次数

在什么情况下,flask 中需要多个应用程序?(不是蓝图)

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)

flask

6
推荐指数
2
解决办法
766
查看次数

如何在QGraphicsview中超越滚动条范围?

我正在QGraphicsView中构建节点图,我正在实现平移.我使用了以下问题" 如何在QGraphicsView中平移图像 ",但是平移受滚动条范围的限制.

我也尝试了翻译方法,但它给出了相同的结果.视图仅限于某个矩形.

我想无限制地平移,图形可以变得非常大,并且能够在场景的不同区域工作是有用的(这里有一个图形,那里有另一个图形等).

qt qgraphicsview pyside

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

如何使用标题中的按钮构建QGroupBox?

我的应用程序需要一个带有标题按钮的组合框.或等同的东西.

这是我的用例.

该应用程序读取数据结构并构建一个适当的面板.可以通过此属性面板添加/删除某些属性.

如果属性是终端,如字符串或整数,则该属性将表示为经典标签以及正确的小部件.我可以轻松地为此布局添加删除按钮.

但是如果属性更复杂并且本身具有一些子属性,则它表示为组合框.原始的QGroupBox只允许一个字符串作为标题,而我想在那里添加一个删除按钮.

我是QT的新手,可能会遗漏一些东西,任何想法?

python qt pyqt

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

在QT中连接Dialogs的最佳方法是什么?

在我的应用程序中,我有一个项目功能,但它需要一系列对话框才能工作.

开始时,用户必须打开现有项目或创建新项目,并且在创建新项目时,用户必须指定文件夹.

因此,在新项目或现有项目之间有一个第一个用于选择的对话框,另一个用于在新项目的情况下打开以选择文件夹.

现在,我在第一个上调用exec_()方法,并在里面做所有事情(创建第二个对话框,使用它,等等).直接后果:它使用副作用很麻烦.

所以问题是:在QT中可以干净地链接对话框吗?

qt pyqt qdialog pyside

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

如何使用行[a,b]将另一个数组索引为数据[a:b]?

我有两个数组,第一个是(n,2)数组,它包含数据池中选择的开始和结束,第二个是数据池.

一般的想法是使用第一个从第二个提取相关数据,但我不知道如何干净利落地使用numpy.

我找到了以下解决方案,但它看起来很笨拙:

relevant_data = datapool[np.arange(*selection[0])]]
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

更新:嵌套索引的能力是一个很大的优势(获得选择的子部分).

python indexing numpy

0
推荐指数
1
解决办法
100
查看次数