- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我们必须运行多线程glfw应用程序时,如果在MainProcess中调用了glfw.create_window()
,程序将停止。
这基本上是更大代码的一部分,我无法更改架构(包括多处理架构),但这是可以重现错误的最小代码。
from multiprocessing import Process, Pipe
import threading, multiprocessing
import glfw
def worker():
print("[Thread]:", threading.get_ident(), "[Process]:", multiprocessing.current_process())
glfw.init()
glfw.window_hint(glfw.VISIBLE, 0)
glfw.window_hint(glfw.DOUBLEBUFFER, 0)
context = glfw.create_window(width=640, height=480, title='Invisible window', monitor=None, share=None)
print("Window was created successfully!")
if __name__ == "__main__":
## Uncomment the following line to see the program halt with errors:
# worker()
np = 10
processes = [Process(target=worker) for i in range(np)]
for p in processes:
p.daemon = True
p.start()
print("LET'S WAIT FOR A LONG TIME!")
import time
time.sleep(1000)
第一
如果我不在主进程中调用glfw.create_window
,代码将正常工作。但是,如果我在其他进程启动之前调用它(您可以取消注释#worker()
以查看此效果),它将导致以下错误(我仅复制了部分输出):
...
XIO: fatal IO error 25 (Inappropriate ioctl for device) on X server ":0"
after 192 requests (192 known processed) with 15 events remaining.
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
XIO: fatal IO error 25 (Inappropriate ioctl for device) on X server ":0"
after 192 requests (192 known processed) with 15 events remaining.
XIO: fatal IO error 25 (Inappropriate ioctl for device) on X server ":0"
...
第二:在#worker()
仍被注释的情况下,glfw.init()
必须位于worker
函数内部,并且不能只调用一次全局,即在 worker
函数之前。为什么会这样?
最佳答案
从错误来看,它似乎来自XCB,这意味着您正在运行带有X11服务器的类UNIX操作系统。
在第一种情况下,会发生初始化 GLFW。然后您创建流程。在类 UNIX 系统上,这是通过使用 fork(2) 系统调用来完成的,该系统调用会生成父进程的完美副本,然后运行父进程和子进程。因此,现在 X11 服务器有两个不同的程序使用相同的连接与其进行通信,并假装是相同的。正如您可以想象的那样,这效果并不好。
此外,许多 GUI 工具包(包括 glfw)在设计上不是线程安全的,并且多处理
使用后台线程进行内务处理。我认为这不是问题所在,但也可能是。
第二种情况是第一种情况的变体;每个进程必须有自己到X服务器的连接。
顺便说一句,glfw.init()
返回一个指示成功或失败的值。在继续之前,您一定应该检查 glfw 是否已成功初始化。
关于python - 如果在 MainProcess 中执行 `glfw.create_window`,为什么多进程 glfw 应用程序将停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54066281/
我正在使用 Python 和 Tkinter 开发一个小项目。我需要显示一个包含一些挖掘机/挖掘机的所有功能的表格。 表格基本上是一个大框架,里面有很多标签对象。我将此框架放入 Canvas 对象内(
我正在尝试使用 Tkinter Canvas (self._canvas) 通过 create_window 函数创建窗口。该函数的 window 字段是一个 Tkinter Frame (self.
我正在使用 tkinter 制作滚动 Canvas 。当我通过create_window链接创建一个窗口,其框架比 Canvas 大,窗口将与 Canvas 的边框重叠。 import Tkinter
我在理解这个函数的作用时遇到了一些困难: canvas.create_window(0, 0,anchor='nw',window=frame) 因为通常 app=tkinter.Tk() 给出一种
当我们必须运行多线程glfw应用程序时,如果在MainProcess中调用了glfw.create_window(),程序将停止。 这基本上是更大代码的一部分,我无法更改架构(包括多处理架构),但这是
我是一名优秀的程序员,十分优秀!