a358003542 / fenci

中文分词模块:继承了jieba分词的基本算法逻辑,进行了全方位的代码优化,还额外提供了HMM算法的训练功能支持。
MIT License
37 stars 6 forks source link

多进程初始化的时候读取缓存文件会报错 #1

Open piekey1994 opened 2 years ago

piekey1994 commented 2 years ago

会报这个错误json.decoder.JSONDecodeError: Expecting ',' delimiter: line 112577 column 19 (char 2131822)

a358003542 commented 2 years ago

@piekey1994 有两种可能性,你说的这个情况更可能是现在json文件的写没写成更安全的备用文件写然后替换的方式,所以有时一些意外情况造成json文件写出错了。这个等下我更新下,换成上面那种更安全的写方式肯定是好的。

第二个可能性是确实是多进程方面的写问题,这块没有考虑,需要加个多进程的测试案例然后看下。原jieba是线程锁,可能多进程会照顾不到。话说回来像模型这样的应用场景直接写成简单的文件锁会更好一些,不管是多线程还是多进程,模型是唯一的,模型被谁写的时候直接弄个文件锁,其他线程或进程或者什么其他什么应用看到这个lock file都不应该有写动作了,只能等待。

a358003542 commented 2 years ago

@piekey1994 这周末抽一天时间解决这个issue吧,没有通篇阅读几遍只是零零碎碎的时间我也不敢下手改代码。

a358003542 commented 2 years ago

@piekey1994 version 0.3.1 75bff5bd30fb22fe6e32bfe5b11e34a49fbf27fa 这个更安全的json文件写动作修改肯定是没问题的。

a358003542 commented 2 years ago

@piekey1994 分支 test_multiprocess version 0.3.2 da5402a8d9cbdd734131dd36556f96bb54783440

移除原有的线程锁,只在模型写的那部分加上了文件锁,优化了模型的部分数据更新逻辑。 update_json_file 会将一些数据汇总之后再统一更新到模型文件中去。

写了一个多线程和多进程的简单单元测试代码,但是老实说这块错误不是很方便重现。

@piekey1994 你可以帮忙尝试下最新的分支代码然后看看还会出现错误吗?

piekey1994 commented 2 years ago

@piekey1994 分支 test_multiprocess version 0.3.2 da5402a

移除原有的线程锁,只在模型写的那部分加上了文件锁,优化了模型的部分数据更新逻辑。 update_json_file 会将一些数据汇总之后再统一更新到模型文件中去。

写了一个多线程和多进程的简单单元测试代码,但是老实说这块错误不是很方便重现。

@piekey1994 你可以帮忙尝试下最新的分支代码然后看看还会出现错误吗?

我之前是在gunicorn里面起多个worker时出现的问题,你可以试试

a358003542 commented 2 years ago

@piekey1994 具体和本模块相关的运行代码也麻烦贴一下,如果只是多进程运行简单的分词已经测试没有问题了。gunicorn环境后面我再测一下。

piekey1994 commented 2 years ago

@piekey1994 具体和本模块相关的运行代码也麻烦贴一下,如果只是多进程运行简单的分词已经测试没有问题了。gunicorn环境后面我再测一下。

没什么代码,就是gunicorn加载main文件的时候在import你这个包后初始化cache的时候就报错了,都没到分词那一步,有空我再实际测试一下吧

a358003542 commented 2 years ago

@piekey1994 pypi已更新到0.3.2版本。 3da2cf3e9efaf8677d1ffc6b816abbfe96be6bb1 。