Running multiple tasks asynchronously
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
Rechercherichtung
Das Issue nennt den Scheduler und die Cron-Ausführung, aber keine Repository-Dateien oder Tests. Beginne damit, den Cron-Einstiegspunkt des Schedulers zu finden und nachzuverfolgen, wie mehrere geplante Aufgaben verteilt werden; vergleiche diesen Ablauf mit den bereitgestellten PHP-Prozess- und Dateisperrbeispielen. Als abgeschlossen sollte eine sichere nebenläufige Ausführung für lang laufende Aufgaben definiert und überprüft sein, ohne die Reihenfolge der Planung oder den Datenschutz zu beeinträchtigen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
I take a look at what been going on here and i wonder if one thing is possible with this.
I work on a project with CI4 which relays heavily on cron to fetch the data from APIs. We're fetching data form about 30 endpoints every minute. And each of the request takes a lot of time to complete the processing. So in other to achieve those I need to spawn a lot of processes to work at the same time. So I have a single command which executed the multiple instances of other command by using something like this
/**
* Spark Exec
*
* @param string $sparkCommand Command
* @param int|null $timeout Timeout
*/
function spark_exec(string $sparkCommand, ?int $timeout = null): void
{
$command = '';
if ($timeout) {
$command .= 'timeout ' . $timeout . ' ';
}
$command .= '"' . PHP_BINARY . '" -c "' . (get_cfg_var('cfg_file_path') ?: PHP_CONFIG_FILE_PATH) . '" ' . ROOTPATH . 'spark ' . $sparkCommand . ' > /dev/null &';
exec($command);
}
And the problem is that I cannot have more that one process working working with the same endpoint and writing the same data db so I have mechanism to put some locks in place so I use files to track the locking
/**
* Crates the Lockfile with the current class name
*
* @param string|null $identifier String to append to the filename
*
* @return bool|resource Locked file if successful otherwise false
*/
public static function lock(?string $identifier = null)
{
//Add leading dash to identifier if it is set
if (isset($identifier)) {
$identifier = '-' . $identifier;
}
//Get the locks file directory
$lockDir = WRITEPATH . 'cron/locks/';
//Create the locks file directory if it does not exist
if (! file_exists($lockDir)) {
mkdir($lockDir, 0755, true);
}
//Get the filename
$filename = $lockDir . $identifier . '.lock';
//Open the file for writing to lock it
$lock = fopen($filename, 'wb');
if ($lock === false) {
// Unable to open file, check that you have permissions to open/write
CLI::error('Unable to write the lock file');
exit;
}
if (flock($lock, LOCK_EX | LOCK_NB) === false) {
// Lock is already in use by another process
CLI::error('Another instance is already running');
exit;
}
//Return the locked file
return $lock;
}
/**
* Closes the file removing the lock
*
* @param resource $lock Lock
*/
public static function unlock(&$lock): void
{
//Check if lock exist
if ($lock && get_resource_type($lock) !== 'Unknown') {
//Get the filename
$metaData = stream_get_meta_data($lock);
$filename = $metaData['uri'];
//Close the file to remove the lock
fclose($lock);
//Remove the lock file
unlink($filename);
}
}
/**
* Check if lock files with set prefix exist
*
* @param string $prefix filename prefix
*
* @return bool Ture if there are lock files otherwise false
*/
public static function isWorking(string $prefix): bool
{
$result = false;
//We read the locks directory if there are lock files it means we're still working
if ($openDir = opendir(WRITEPATH . 'cron/locks/')) {
while (($file = readdir($openDir)) !== false) {
if (substr($file, 0, strlen($prefix)) === $prefix) {
$result = true;
break;
}
}
}
return $result;
}
I wonder if there are plans to be able to achieve something similar with the scheduler here. From looking at the code I believe all the scheduled actions run on a single thread. So for example if I have 2 tasks scheduled to run first runs every 5 minutes second task runs every minute. And if first task takes more that 1 minute to be completed. On the next cron run second task will be started but once the first process finishes with task 1 it will continue with the second task in the first process and the order of execution is completely broken.
And there are a lot of real case situations where long running tasks are needed. One example is generating sitemap from the database for the huge site
- Vorherrschende Sprache
- PHP
- Sterne
- 126
- Forks
- 25
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus codeigniter4/tasks
-
Extending TasksOffenenhancement
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 30/100
codeigniter4/tasks#34 · 2 Kommentare · 1 Reaktion ·
-
debug toolbar paneOffenenhancement help wanted
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 20/100
codeigniter4/tasks#6 ·
-
Notification systemOffenenhancement help wanted
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 15/100
codeigniter4/tasks#4 ·
Alle Issues in codeigniter4/tasks
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
Automattic/blocks-engine#2866 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
community-scripts/ProxmoxVE#17944 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
EasyCorp/EasyAdminBundle#7861 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement good first issue help wanted
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
-
backend gamification P0
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
semanadeinformatica/website#461 ·