我编写了一个应用程序,该应用程序必须从数千个大型docx文件中解析和检索一些数据.它将在具有许多CPU,大量RAM和RAID阵列中快速SSD的高性能生产服务器上运行,因此显然我想充分利用所有可用的性能.
我发现我的应用程序可以在许多并发线程中成功完成任何其他工作,但是无法使用docx4j库并发地解析许多docx文件.而且,该库不能安全地在多个单独的线程中支持多个WordprocessingMLPackage类实例,该实例包含docx文件中的数据.
谷歌搜索和检查该库的源代码可以确认它完全不是线程安全的(例如,其类包含许多不能同时使用的静态字段和实例).
所以我有一些问题要问:
>是否有其他具有相同功能且可以保证线程安全的库?
>是否可以在某些单独的进程中启动我的工作程序,而不是在单独的线程中启动我的工作程序,以解决此问题?如果是这样,它将严重降低我的应用程序的性能吗?
解决方法:
我不知道替代的线程安全库.
在单独的进程中启动工作程序是一种可行的解决方法-与使用单独的线程相比,启动成本会更高,但是如果要处理大量文件,这可能并不重要.您需要某种方式来使流程进行通信,一种选择是使用Redis-使用SETNX原子地将一个文件名添加到键值存储中,如果设置成功,则工作程序可以处理该文件,并且如果设置失败,则该文件已经在执行另一个进程.另一种选择是让管理器进程通过套接字将文件分配给工作进程.