文章内容
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内存使用完,所以在使用的时候需要考虑数据量的大小。
黄兵个人博客原创。
评论列表