diff -Nuar a/vendor/magento/module-message-queue/Console/StartConsumerCommand.php b/vendor/magento/module-message-queue/Console/StartConsumerCommand.php
--- a/vendor/magento/module-message-queue/Console/StartConsumerCommand.php
+++ b/vendor/magento/module-message-queue/Console/StartConsumerCommand.php
@@ -11,7 +11,7 @@ use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
 use Magento\Framework\MessageQueue\ConsumerFactory;
-use Magento\MessageQueue\Model\Cron\ConsumersRunner\PidConsumerManager;
+use Magento\Framework\Lock\LockManagerInterface;
 
 /**
  * Command for starting MessageQueue consumers.
@@ -22,6 +22,7 @@ class StartConsumerCommand extends Command
     const OPTION_NUMBER_OF_MESSAGES = 'max-messages';
     const OPTION_BATCH_SIZE = 'batch-size';
     const OPTION_AREACODE = 'area-code';
+    const OPTION_SINGLE_THREAD = 'single-thread';
     const PID_FILE_PATH = 'pid-file-path';
     const COMMAND_QUEUE_CONSUMERS_START = 'queue:consumers:start';
 
@@ -36,9 +37,9 @@ class StartConsumerCommand extends Command
     private $appState;
 
     /**
-     * @var PidConsumerManager
+     * @var LockManagerInterface
      */
-    private $pidConsumerManager;
+    private $lockManager;
 
     /**
      * StartConsumerCommand constructor.
@@ -47,23 +48,23 @@ class StartConsumerCommand extends Command
      * @param \Magento\Framework\App\State $appState
      * @param ConsumerFactory $consumerFactory
      * @param string $name
-     * @param PidConsumerManager $pidConsumerManager
+     * @param LockManagerInterface $lockManager
      */
     public function __construct(
         \Magento\Framework\App\State $appState,
         ConsumerFactory $consumerFactory,
         $name = null,
-        PidConsumerManager $pidConsumerManager = null
+        LockManagerInterface $lockManager = null
     ) {
         $this->appState = $appState;
         $this->consumerFactory = $consumerFactory;
-        $this->pidConsumerManager = $pidConsumerManager ?: \Magento\Framework\App\ObjectManager::getInstance()
-            ->get(PidConsumerManager::class);
+        $this->lockManager = $lockManager ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(LockManagerInterface::class);
         parent::__construct($name);
     }
 
     /**
-     * {@inheritdoc}
+     * @inheritdoc
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
@@ -71,30 +72,36 @@ class StartConsumerCommand extends Command
         $numberOfMessages = $input->getOption(self::OPTION_NUMBER_OF_MESSAGES);
         $batchSize = (int)$input->getOption(self::OPTION_BATCH_SIZE);
         $areaCode = $input->getOption(self::OPTION_AREACODE);
-        $pidFilePath = $input->getOption(self::PID_FILE_PATH);
 
-        if ($pidFilePath && $this->pidConsumerManager->isRun($pidFilePath)) {
-            $output->writeln('<error>Consumer with the same PID is running</error>');
-            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
+        if ($input->getOption(self::PID_FILE_PATH)) {
+            $input->setOption(self::OPTION_SINGLE_THREAD, true);
         }
 
-        if ($pidFilePath) {
-            $this->pidConsumerManager->savePid($pidFilePath);
+        $singleThread = $input->getOption(self::OPTION_SINGLE_THREAD);
+
+        if ($singleThread && $this->lockManager->isLocked(md5($consumerName))) { //phpcs:ignore
+            $output->writeln('<error>Consumer with the same name is running</error>');
+            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
         }
 
-        if ($areaCode !== null) {
-            $this->appState->setAreaCode($areaCode);
-        } else {
-            $this->appState->setAreaCode('global');
+        if ($singleThread) {
+            $this->lockManager->lock(md5($consumerName)); //phpcs:ignore
         }
 
+        $this->appState->setAreaCode($areaCode ?? 'global');
+
         $consumer = $this->consumerFactory->get($consumerName, $batchSize);
         $consumer->process($numberOfMessages);
+
+        if ($singleThread) {
+            $this->lockManager->unlock(md5($consumerName)); //phpcs:ignore
+        }
+
         return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
     }
 
     /**
-     * {@inheritdoc}
+     * @inheritdoc
      */
     protected function configure()
     {
@@ -125,11 +132,17 @@ class StartConsumerCommand extends Command
             'The preferred area (global, adminhtml, etc...) '
             . 'default is global.'
         );
+        $this->addOption(
+            self::OPTION_SINGLE_THREAD,
+            null,
+            InputOption::VALUE_NONE,
+            'This option prevents running multiple copies of one consumer simultaneously.'
+        );
         $this->addOption(
             self::PID_FILE_PATH,
             null,
             InputOption::VALUE_REQUIRED,
-            'The file path for saving PID'
+            'The file path for saving PID (This option is deprecated, use --single-thread instead)'
         );
         $this->setHelp(
             <<<HELP
@@ -150,8 +163,12 @@ To specify the number of messages per batch for the batch consumer:
 To specify the preferred area:
 
     <comment>%command.full_name% someConsumer --area-code='adminhtml'</comment>
+
+To do not run multiple copies of one consumer simultaneously:
+
+    <comment>%command.full_name% someConsumer --single-thread'</comment>
 
-To save PID enter path:
+To save PID enter path (This option is deprecated, use --single-thread instead):
 
     <comment>%command.full_name% someConsumer --pid-file-path='/var/someConsumer.pid'</comment>
 HELP
diff -Nuar a/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner.php b/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner.php
--- a/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner.php
+++ b/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner.php
@@ -13,18 +13,13 @@ use Magento\Framework\MessageQueue\Consumer\ConfigInterface as ConsumerConfigInt
 use Magento\Framework\App\DeploymentConfig;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\Process\PhpExecutableFinder;
-use Magento\MessageQueue\Model\Cron\ConsumersRunner\PidConsumerManager;
+use Magento\Framework\Lock\LockManagerInterface;
 
 /**
  * Class for running consumers processes by cron
  */
 class ConsumersRunner
 {
-    /**
-     * Extension of PID file
-     */
-    const PID_FILE_EXT = '.pid';
-
     /**
      * Shell command line wrapper for executing command in background
      *
@@ -53,13 +48,6 @@ class ConsumersRunner
      */
     private $phpExecutableFinder;
 
-    /**
-     * The class for checking status of process by PID
-     *
-     * @var PidConsumerManager
-     */
-    private $pidConsumerManager;
-
     /**
      * @var ConnectionTypeResolver
      */
@@ -70,13 +58,20 @@ class ConsumersRunner
      */
     private $logger;
 
+    /**
+     * Lock Manager
+     *
+     * @var LockManagerInterface
+     */
+    private $lockManager;
+
     /**
      * @param PhpExecutableFinder $phpExecutableFinder The executable finder specifically designed
      *        for the PHP executable
      * @param ConsumerConfigInterface $consumerConfig The consumer config provider
      * @param DeploymentConfig $deploymentConfig The application deployment configuration
      * @param ShellInterface $shellBackground The shell command line wrapper for executing command in background
-     * @param PidConsumerManager $pidConsumerManager The class for checking status of process by PID
+     * @param LockManagerInterface $lockManager The lock manager
      * @param ConnectionTypeResolver $mqConnectionTypeResolver Consumer connection resolver
      * @param LoggerInterface $logger Logger
      */
@@ -85,7 +80,7 @@ class ConsumersRunner
         ConsumerConfigInterface $consumerConfig,
         DeploymentConfig $deploymentConfig,
         ShellInterface $shellBackground,
-        PidConsumerManager $pidConsumerManager,
+        LockManagerInterface $lockManager,
         ConnectionTypeResolver $mqConnectionTypeResolver = null,
         LoggerInterface $logger = null
     ) {
@@ -93,7 +88,7 @@ class ConsumersRunner
         $this->consumerConfig = $consumerConfig;
         $this->deploymentConfig = $deploymentConfig;
         $this->shellBackground = $shellBackground;
-        $this->pidConsumerManager = $pidConsumerManager;
+        $this->lockManager = $lockManager;
         $this->mqConnectionTypeResolver = $mqConnectionTypeResolver
             ?: ObjectManager::getInstance()->get(ConnectionTypeResolver::class);
         $this->logger = $logger
@@ -120,11 +115,9 @@ class ConsumersRunner
                 continue;
             }
 
-            $consumerName = $consumer->getName();
-
             $arguments = [
-                $consumerName,
-                '--pid-file-path=' . $this->getPidFilePath($consumerName),
+                $consumer->getName(),
+                '--single-thread'
             ];
 
             if ($maxMessages) {
@@ -154,7 +147,7 @@ class ConsumersRunner
             return false;
         }
 
-        if ($this->pidConsumerManager->isRun($this->getPidFilePath($consumerName))) {
+        if ($this->lockManager->isLocked(md5($consumerName))) { //phpcs:ignore
             return false;
         }
 
@@ -162,28 +155,17 @@ class ConsumersRunner
         try {
             $this->mqConnectionTypeResolver->getConnectionType($connectionName);
         } catch (\LogicException $e) {
-            $this->logger->info(sprintf(
-                'Consumer "%s" skipped as required connection "%s" is not configured. %s',
-                $consumerName,
-                $connectionName,
-                $e->getMessage()
-            ));
+            $this->logger->info(
+                sprintf(
+                    'Consumer "%s" skipped as required connection "%s" is not configured. %s',
+                    $consumerName,
+                    $connectionName,
+                    $e->getMessage()
+                )
+            );
             return false;
         }
 
         return true;
     }
-
-    /**
-     * Returns default path to file with PID by consumers name
-     *
-     * @param string $consumerName The consumers name
-     * @return string The path to file with PID
-     */
-    private function getPidFilePath($consumerName)
-    {
-        $sanitizedHostname = preg_replace('/[^a-z0-9]/i', '', gethostname());
-
-        return $consumerName . '-' . $sanitizedHostname . static::PID_FILE_EXT;
-    }
 }
diff -Nuar a/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner/PidConsumerManager.php b/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner/PidConsumerManager.php
deleted file mode 100644
--- a/vendor/magento/module-message-queue/Model/Cron/ConsumersRunner/PidConsumerManager.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-namespace Magento\MessageQueue\Model\Cron\ConsumersRunner;
-
-use Magento\Framework\App\Filesystem\DirectoryList;
-use Magento\Framework\Filesystem\Directory\WriteInterface;
-use Magento\Framework\Filesystem\Directory\ReadInterface;
-use Magento\Framework\Filesystem;
-use Magento\Framework\Exception\FileSystemException;
-
-/**
- * The class for checking status of process by PID
- */
-class PidConsumerManager
-{
-    /**
-     * Extension of PID file
-     * @deprecated Moved to the correct responsibility area
-     * @see \Magento\MessageQueue\Model\Cron\ConsumersRunner::PID_FILE_EXT
-     */
-    const PID_FILE_EXT = '.pid';
-
-    /**
-     * The class for working with FS
-     *
-     * @var Filesystem
-     */
-    private $filesystem;
-
-    /**
-     * @param Filesystem $filesystem The class for working with FS
-     */
-    public function __construct(Filesystem $filesystem)
-    {
-        $this->filesystem = $filesystem;
-    }
-
-    /**
-     * Checks if consumer process is run by pid from pidFile
-     *
-     * @param string $pidFilePath The path to file with PID
-     * @return bool Returns true if consumer process is run
-     * @throws FileSystemException
-     */
-    public function isRun($pidFilePath)
-    {
-        $pid = $this->getPid($pidFilePath);
-        if ($pid) {
-            if (function_exists('posix_getpgid')) {
-                return (bool) posix_getpgid($pid);
-            } else {
-                return $this->checkIsProcessExists($pid);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks that process is running
-     *
-     * If php function exec is not available throws RuntimeException
-     * If shell command returns non-zero code and this code is not 1 throws RuntimeException
-     *
-     * @param int $pid A pid of process
-     * @return bool Returns true if consumer process is run
-     * @throws \RuntimeException
-     * @SuppressWarnings(PHPMD.UnusedLocalVariable)
-     */
-    private function checkIsProcessExists($pid)
-    {
-        if (!function_exists('exec')) {
-            throw new \RuntimeException('Function exec is not available');
-        }
-
-        exec(escapeshellcmd('ps -p ' . $pid), $output, $code);
-
-        $code = (int) $code;
-
-        switch ($code) {
-            case 0:
-                return true;
-                break;
-            case 1:
-                return false;
-                break;
-            default:
-                throw new \RuntimeException('Exec returned non-zero code', $code);
-                break;
-        }
-    }
-
-    /**
-     * Returns pid by pidFile path
-     *
-     * @param string $pidFilePath The path to file with PID
-     * @return int Returns pid if pid file exists for consumer else returns 0
-     * @throws FileSystemException
-     */
-    public function getPid($pidFilePath)
-    {
-        /** @var ReadInterface $directory */
-        $directory = $this->filesystem->getDirectoryRead(DirectoryList::VAR_DIR);
-
-        if ($directory->isExist($pidFilePath)) {
-            return (int) $directory->readFile($pidFilePath);
-        }
-
-        return 0;
-    }
-
-    /**
-     * Saves pid of current process to file
-     *
-     * @param string $pidFilePath The path to file with pid
-     * @throws FileSystemException
-     */
-    public function savePid($pidFilePath)
-    {
-        /** @var WriteInterface $directory */
-        $directory = $this->filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
-        $directory->writeFile($pidFilePath, function_exists('posix_getpid') ? posix_getpid() : getmypid(), 'w');
-    }
-}
