【问题标题】:Performance of multiprocessing多处理性能
【发布时间】:2017-08-25 08:55:16
【问题描述】:

我创建了一个非常简单的脚本,它适用于多处理和 SQL。本练习的目的是获得最短的执行时间:

def Query(Query):
    conn = sqlite3.connect("DB.db")
    cur = conn.cursor()  
    cur.execute(Query)
    cur.close()
    conn.close()
    return


if __name__ == '__main__':
    conn = sqlite3.connect("DB.db")
    cur = conn.cursor()
    start = time.time()
    curOperations.execute(QUERY)
    curOperations.execute(QUERY)
    curOperations.execute(QUERY)
    end = time.time()
    TIME1 = end - start
    cur.execute('PRAGMA journal_mode=wal')
    conn.commit()

    start = time.time()
    pool = Pool(processes=2)
    pool.imap(Query,[QUERY, QUERY, QUERY])
    pool.close()
    pool.join()
    end = time.time()
    TIME2 = end - start
    cur.close()
    conn.close()

执行 20 次后 TIME1 的平均结果为 13.43,TIME2 为 10.39。

不应该低于那个吗?!我是不是做错了什么?

【问题讨论】:

  • 13.43 / 3 = 4.48 sec10.39 / 2 = 5.2 sec 考虑到创建新流程的开销是相当可比的。我会说它的表现比我预期的要好。
  • 我不明白你为什么在多处理情况下除以 2
  • 3 个任务,2 个进程,这意味着其中一个必须依次完成 2 个工作。

标签: python python-2.7 sqlite python-multiprocessing


【解决方案1】:

对于我的回答,我将假设您的查询仅读取数据库中的内容。

在尝试加快速度之前,您需要了解究竟是什么阻碍了进程加快。 并非所有速度问题都可以通过多处理来改善!

所以你真正需要做的是profile应用程序,看看它把时间花在了哪里。

由于 SQLite 会缓存查询,我建议在单个进程中分别计时每次执行查询。 我怀疑第一个查询比以下查询花费的时间更长。

还要考虑多处理情况下的开销。查询必须经过腌制并通过 IPC 发送到工作进程。然后每个工作人员必须创建一个连接和游标,然后关闭它们。在现实世界的情况下,您的查询函数会对数据做一些事情,例如将其返回给主进程,这也需要对其进行酸洗并通过 IPC 发送。

由于所有工作人员都访问同一个数据库,在某些时候从数据库读取将成为瓶颈。

如果您查询修改数据库,无论如何都会对访问进行序列化以防止损坏。

【讨论】:

  • 如果我只做一个连接而不是做一个连接par查询会怎样
  • 这会减少开销,但仍然不能说它会更快。不要猜测,测量
猜你喜欢
  • 2012-12-15
  • 2013-07-07
  • 2022-10-19
  • 2015-10-19
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多