文章内容

2020/9/25 15:04:47,作 者: 黄兵

futures.ProcessPoolExecutor() 并行计算

concurrent.futures模块实现的是真正的并行计算,因为它使用ProcessPoolExecutor类把工作分配个多个Python进程处理。因此,如果需要CPU密集型处理,使用这个模块能够绕开GIL,利用所有可用的CPU核心。

下面是ProcessPoolExecutor类的一个示例:

def current_network(self):
    ip_range = '0.0.0.0/8'
    with futures.ProcessPoolExecutor() as executor:
        to_do = []
        for item in IP(ip_range):
            future = executor.submit(self.insert_one, item)
            to_do.append(future)
            print('Scheduled for {}: {}'.format(item, future))

        results = []
        for future in futures.as_completed(to_do):
            res = future.result()
            print('{} result: {!r}'.format(future, res))
            results.append(res)

    return len(results)

def insert_one(self, ip):
    with closing(self._conn_mysql) as mysql_conn:
        with closing(mysql_conn.cursor()) as cur:
            insert_sql = "UPDATE ip_address SET ip_type_id = 1, ip_description_id = 1, ip_version_id = 1 WHERE ip = '{ip_str}';".format(
                ip_str=ip)
            # 执行SQL语句
            try:
                cur.execute(insert_sql)
            except (MySQLdb.Error, MySQLdb.Warning) as e:
                self._logger.error(
                    '更新IP地址出现错误,具体错误内容: {error_message},IP地址:{ip_addr}'.format(error_message=e, ip_addr=ip))
            mysql_conn.commit()

这里存在一些问题,由于for循环很快,但是向数据库写数据显然没有for遍历的数据快,我这边测试上面一个代码,很快16G内存使用完,所以在使用的时候需要考虑数据量的大小。


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - futures.ProcessPoolExecutor() 并行计算

Python sorted
Python命令行参数
分享到:

发表评论

评论列表