当我使用Linux Task-crontab时如何同时解决多个问题

时间:2018-12-23 13:43:24

标签: php cron

这里有一个问题:我需要执行一个任务,每分钟将许多数据放入另一个mysql数据库中;如果第一个任务尚未完成,则第二个任务已经开始;因此,存在多个并发问题;如何解决问题?

我有一些想法,首先,让任务的执行时间少于下一个任务的开始时间;其次,让任务支持多进程;但是,我不怎么写代码?

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/pandas/core/frame.py", line 1945, in to_parquet
    compression=compression, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parquet.py", line 256, in to_parquet
    impl = get_engine(engine)
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parquet.py", line 25, in get_engine
    return FastParquetImpl()
  File "/usr/local/lib/python3.6/site-packages/pandas/io/parquet.py", line 180, in __init__
    import fastparquet
  File "/usr/local/lib/python3.6/site-packages/fastparquet/__init__.py", line 8, in <module>
    from .core import read_thrift
  File "/usr/local/lib/python3.6/site-packages/fastparquet/core.py", line 13, in <module>
    from . import encoding
  File "/usr/local/lib/python3.6/site-packages/fastparquet/encoding.py", line 11, in <module>
    from .speedups import unpack_byte_array
  File "__init__.pxd", line 861, in init fastparquet.speedups
ValueError: numpy.ufunc has the wrong size, try recompiling. Expected 192, got 216

您能帮我解决问题吗?

1 个答案:

答案 0 :(得分:0)

最简单的方法是设置一个标志,以告知该进程已在进行中,并在函数开始时检查是否存在这种情况。我不知道您如何设置代码的可见性,因此我将其留给您将$ myFile提取到文件/类范围(文件路径也是如此,您可能想使用/ var或/日志文件夹)。

要点是:我们创建一个文件(如果它不存在或其中有0)-这意味着我们可以开始工作。另一方面,如果文件的内容为1,则该进程将终止,并且每次运行时都是如此,直到第一个完成并将文件的内容重写为0(这意味着该进程不在进步了。

public function execute(Input $input, Output $output)
{
    if ($this->isProcessInProgress()) {
        die('Process is in progress');
    }

    $this->startProcess();

    $tele_data = [...];

    foreach($tele_data as $key=>$value) {
        static::pushTeleToIdc($value);
    }

    $this->finishProcess();
}

private function isProcessInProgress() {
    $myFile = 'tele_to_idc_process.txt';
    $handle = fopen($myFile, 'r');

    if (!$handle)
        return false;

    $status = fread($handle, 1);
    fclose($handle);

    return (bool) $status;
}

private function startProcess() {
    $myFile = 'tele_to_idc_process.txt';
    $handle = fopen($myFile, 'w');

    if (!$handle)
        return;

    $status = fwrite($handle, '1');

    fclose($handle);
}

private function finishProcess() {
    $myFile = 'tele_to_idc_process.txt';
    $handle = fopen($myFile, 'w');

    if (!$handle)
        return;

    $status = fwrite($handle, '0');

    fclose($handle);
}

如果该文件不存在,您可能会收到警告,可以使用@fopen而不是fopen来取消显示该文件