当前位置: 首页 > 知识库问答 >
问题:

并发运行100,000个进程

岑元徽
2023-03-14

我正在模拟一个银行系统,其中我有10万个交易要运行。每种类型的事务实现runnable,我有各种类型的事务可以发生。

transactions是一个运行库数组。

理想情况下,下面的代码可以解决我的问题:

for (Transaction transaction : transactions) {
    new Thread(transaction).start();
}
ExecutorService service;
int cpus = Runtime.getRuntime().availableProcessors();
// cpus == 8 in my case
service = Executors.newFixedThreadPool(cpus);

for (Transaction transaction : transactions) {
    service.execute(transaction);
}

public void makeTransaction() {
    synchronized(account) {
        long timeStarted = System.nanoTime();
        long timeToEnd = timeStarted + nanos;

        this.view = new BatchView(transactionNumber, account.getId());

        this.displayView();

        while(true) {
            if(System.nanoTime() % 1000000000 == 0) {
                System.out.println("batch | " + account.getId());
            }

            if(System.nanoTime() >= timeToEnd) {
                break;
            }
        }
    }
}

每次运行此事务时,只有一个帐户被锁定,剩下9个帐户可供处理。为什么JVM不再处理任何线程,而是挂起直到这个长事务完成?

下面是一个指向该项目的简化版本的链接,以演示该问题:project

共有1个答案

丁毅庵
2023-03-14

分析应用程序时,在长事务发生时不允许其他线程运行。

此任务很可能使用的资源是单线程的。即,ti的写入方式防止了并发使用。

如何才能在不遇到内存问题的情况下以最快的速度运行100,000个事务?

 类似资料:
  • 我目前正在开发的应用程序需要可伸缩的实时通信。我们一直在研究和试用Firebase实时数据库和FireStore。Firebase实时数据库似乎已经比较成熟并经过测试,而firestore还处于测试阶段,这也是我们倾向于实时数据库的原因。 是否有一种更简单的方法来扩展超过100.000个用户,或者是否有可能增加单个Firebase实时数据库的并发连接量?对我来说,如果你需要做这么多的“负载”来平衡

  • 我正在试图理解如何为多个子进程构建并行计算管道。正如我所看到的,每个子进程块等待前一个代码块运行,而我有一个管道,它对前一个运行没有依赖关系,并且可以并行处理。我想知道这是不是可能的,如果是这样的话,一个示例语法来展示如何做到这一点将是一个很大的帮助!提前道谢。

  • 我有一个Spring Boot2.1.6.Release应用程序,其中我有一个用 但它似乎没有工作,因为它仍然在等待一个执行结束,然后再开始下一个。 在@scheduled注释中使用cron进行并行执行的正确方法是什么?

  • 我正在尝试将bash脚本迁移到Python。 bash脚本并行运行多个OS命令,然后在继续之前等待它们完成,即: 命令 我希望使用Python子进程实现同样的目标。这可能吗?如何等待subprocess.call命令完成后再继续?

  • 我正在从NPM迁移到Thread,我希望并行运行脚本,例如: 它在纱线中的等价物是什么? 我发现它的等价物是分别运行每一个: 但是我不能并行运行脚本。 如何使用多个脚本

  • 问题内容: 我有一堆添加到的生产者线程和一个接收对象的工作线程。现在,我想扩展它,以使两个工作线程可以接收对象,但是对对象执行不同的工作。这是一个转折: 我希望 两个 接收线程都处理已放在队列中的对象。 如果我继续使用BlockingQueue,则两个线程将争用对象,只有一个工作线程将获取对象。 因此,我正在寻找类似于BlockingQueue的东西,但是具有广播行为。 应用程序:生产者线程实际上