この質問は、プロセス内からX-windowsを起動するときに同じエラーメッセージが表示される他の多くの記事と関連しています。最初の問題(ipython 2.6で見つけたもの):matplotlib(Tkinkerバックエンド)がmultiprocessing.processでクラッシュする - XInitThreadsを呼び出す方法
私は長いプロセスがあり、1つのpythonセッションで別々のプロセスを使ってparrallelで実行するのが理にかなっています。これらのプロセスは、matplotlib.pyplotを使用してグラフをプロットします。しかし、pyplot.show()またはpyplot.figureは()プロセスが呼び出されたときに次のエラーで全体のpythonセッションをクラッシュ:
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this ia a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python2.7: xcb_io.c:259: poll_for_event: Assertion '!xcb_xlib_threads_sequence_lost' failed.
Aborted
私はよりはるかに簡単な形でこのエラーを再現することができましたipythonコマンドライン:
from matplotlib import pyplot
import multiprocessing as mp
def plot():
pyplot.plot([1,2,3,4])
pyplot.show() #this is the line it crashes on
# the next two lines are only needed if not iython --pyplot or you have not called pyplot.ion()
pyplot.plot([1,2,3,4])
pyplot.show() #close plot
p=mp.process.Process(target=plot)
p.start() #crash!!!!!
matplotlib.get_backend()
のチェックは私も素敵なGUIを作るためにTkinker
を使用していた同じエラーでTKAgg/Tkinker
その他を実行している示しています。また、別のxtermsの別のipython
セッションからの私のplot
ルーチンを問題なく実行することができます。 (これは、Process
コマンドがそれ自身の名前空間を作成するコマンドを与えても同じことに思えます)。
私の質問はどこで(Pythonで)私はXIitThreadsを見つけるのですか?どのように/いつ実行されますか?それを越えた指は私の問題(そしてここで似たようなもの)を解決します。私はこの投稿を見つけました:Threading: PyQt crashes with "unknown request in queue while dequeuing"これはPyQt4バックエンドのためのものです(私は持っていないのでインストールできません)。
EDIT - pyplot.show()をpyplot.show(block = False )あなたは離れていないウィンドウが残っています - pyplot.save()の利点かもしれません。
また、Tkinterまたはmatplotlib内のxcb_ioへの呼び出しを検出しようとしても失敗しました。
プロットを育てていないが回避策です(私もPythonプログラムからブラウザを実行できる)が、エラーメッセージがXInitThreads実行するために私に語っ与えられた(と他のGUIを作成すると同じエラーを持っている)、試してみるいいかもしれませんそれが最初に。 eplotsの上に輝くことについての素晴らしいことは、ユーザーが詳細を見るためにズームインできることです。 – SRD
複数のプロセスがあります。一つのプロセスを '.show()'に任せることができ、作業員のミツバチが完成したプロットを送るようにする方法はありますか? –
それらはピクルスを通過するのですか?もしそうでなければ、それは難しいかもしれません。私が知っている限り、プロセスから返送されたものはすべて漬けにされなければならない。素晴らしい解決策かもしれません。 – SRD