奇怪的错误:QObject :: ~QObject:无法从另一个线程

时间:2017-01-02 18:56:56

标签: python matplotlib python-multiprocessing

此代码运行正常,因为产生了所需的输出,但显示了一条奇怪的错误消息:

  

QObject :: ~QObject:无法从另一个线程停止定时器。

from multiprocessing import Pool,Manager
import matplotlib.pyplot as plt
import numpy as np
import time

def scatter_join(args):
    num = args[2]
    print(num)
    plt.scatter(args[0],args[1],s=1)
    plt.savefig('test_p'+str(num)+'.png')
    if args[3].empty() is False:
        args[4].acquire()
        (ax,fig) = args[3].get()
        ax.scatter(args[0],args[1],s=1)
        args[3].put((ax,fig))
        args[4].release()
    else:
        args[4].acquire()
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.scatter(args[0],args[1],s=1)
        args[3].put((ax,fig))
        args[4].release()

    return None



if __name__ == '__main__':
    p = Pool()
    m = Manager()
    q = m.Queue()
    l = m.Lock()
    snap = []
    for looper in range(0,50):
        np.random.seed(int(time.time()))
        snap.append( np.random.normal(0+np.random.randint(-5,5),20+np.random.randint(-5,5),(10000,2)) )

    task = [(snap[x][:,0],snap[x][:,1],x,q,l) for x in range(0,50)]
    t = time.time()
    results = p.map(scatter_join,task,chunksize=18)

    p.close()
    p.join()
    print('Time Elapsed(Parallel): ', abs((time.time()-t)))

    (ax,fig) = q.get()
    fig.savefig('superimposedimg.png')


    t = time.time()
    for looper in range(0,50):
        print(looper)
        np.random.seed(int(time.time()))
        plt.scatter(snap[looper][:,0],snap[looper][:,1],s=1)
        plt.savefig('test_s'+str(looper)+'.png')
        plt.clf()
    print('Time Elapsed(Linear): ',abs(time.time()-t))

我基本上想要使用多处理在simgle matplotlib对象中绘制绘图图形。

1 个答案:

答案 0 :(得分:0)

当这样绘图时,你需要确保后端 设置为agg后端。您可以在matplotlibrc文件中执行此操作 直接在绘图脚本中,导入matplotlib后立即执行 在导入pyplot之前(如果你完全使用pyplot)。

# do this before importing pylab or pyplot
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

http://matplotlib.org/faq/howto_faq.html#howto-webapp

你也可以单独策划。例如:

fig = plt.figure()
fig, ax = plt.subplots()
 > plot stuff, scatterplot, etc..., set title, lables, etc...
fig.savefig(filename, format='png', dpi=100, facecolor='w',
edgecolor='k') 
plt.close(fig)

注意:因为我们在你不必使用fig.clf()来清除之后关闭了情节。