/** * Register the worker timeout handler (PHP 7.1+). * * @param \Illuminate\Contracts\Queue\Job|null $job * @param \Illuminate\Queue\WorkerOptions $options * @return void */ protectedfunctionregisterTimeoutHandler($job, WorkerOptions $options) { if ($this->supportsAsyncSignals()) { // We will register a signal handler for the alarm signal so that we can kill this // process if it is running too long because it has frozen. This uses the async // signals supported in recent versions of PHP to accomplish it conveniently. pcntl_signal(SIGALRM, function () { $this->kill(1); });
/** * Register the worker timeout handler. * * @param \Illuminate\Contracts\Queue\Job|null $job * @param \Illuminate\Queue\WorkerOptions $options * @return void */ protectedfunctionregisterTimeoutHandler($job, WorkerOptions $options) { // We will register a signal handler for the alarm signal so that we can kill this // process if it is running too long because it has frozen. This uses the async // signals supported in recent versions of PHP to accomplish it conveniently. pcntl_signal(SIGALRM, function () use ($job, $options) { if ($job) { $this->markJobAsFailedIfWillExceedMaxAttempts( $job->getConnectionName(), $job, (int) $options->maxTries, $this->maxAttemptsExceededException($job) ); }
我们都知道扫描一遍只需要 O(n) 的时间,但是由于 MySQL 的这种机制加上
chunk,会直接导致时间复杂度增加为 O(n²)
,在我们数据量越多的时候,速度下降得就越快。
解决方法
1. 记录上一次的最大
id(推荐使用)
在 MySQL 中的 InnoDB 引擎,主键索引字段是一个聚簇索引,存在 B+
树的叶子节点层,是有序的。
我们可以利用这个特点,将上一次的最大 id (主键)记录下来,假设是
lastId,然后下一次查询的时候,加上
where id > lastId,这个时候我们的 limit
语句也要改一下,改成 limit count,就可以了,因为我们告诉了
MySQL offset 是什么。这样 MySQL 就不用做一些重复的扫描操作了。
一定要注意,y 比 x 大意味着 x < y 为真,而不是 y > x 为真。y
> x 的结果如何并不重要,甚至 y > x 是没定义的都没有关系。
在 STL 中,x 和 y 相等也往往不等价于 x == y
为真。对于在未排序的区间上进行的算法,如排序查找算法
find,查找过程中比较两个元素是否相等用的是 ==
运算符;但是对于在排好序的区间上进行查找、合并等操作的算法(如折半查找算法
binary_search,关联容器自身的成员函数 find)来说,x 和 y 相等是与 x <
y 和 y < x 同时为假 等价的,与 == 运算符无关。看上去 x < y 和 y
< x 同时为假就应该和 x == y 为真等价,其实不然。例如下面的 class
A:
1 2 3 4 5 6
classA { int v; public: booloperator<(const A& a) const { returnfalse; } };
可以看到,对任意两个类 A 的对象 x、y,x < y 和 y < x
都是为假的。也就是说,对 STL 的关联容器和许多算法来说,任意两个类 A
都是相等的,这与 == 运算符的行为无关。