产生worker timeout 的背景
while 1:
.....
time.sleep(1)
gunicorn运行起来,只等待了30s,就卡住了,没报任何异常或err,查了gunicorn 官方文档,原来是线程默认等待30s 就kill 掉,再restart
http://docs.gunicorn.org/en/stable/settings.html
timeout
-t INT, --timeout INT
30
Workers silent for more than this many seconds are killed and restarted.
Generally set to thirty seconds. Only set this noticeably higher if you’re sure of the repercussions for sync workers. For the non sync workers it just means that the worker process is still communicating and is not tied to the length of time required to handle a single request.
根本原因找到了,在gunicorn启动加了--timeout 120 ,还是超过30s 就worker timeout.搜了一圈stack没发现好的解决方法。
解决这个问题,目前最好的方法,就是在程序改代码,原先是主线程调用,用threading包装一下
如:
import threading
t = threading.Thread(name = '', target = func ,kwargs{})
t.daemon = True
t.start()
t = threading.Thread(name='result_package', target=result_package, args=(pack_name, task, issue))
t.daemon = True t.start()
这样就在主线程下,把方法包装起来。
顺便用
Event().wait(15) 替代 time.sleep(16)
这样写法的好处是不占用cpu,释放!
刚开始,分析原因花了不少时间,几行代码就把worker timeout解决了。之前试了map.thread不行。
准备用队列(celery+redis)替代原来的逻辑,只是工作量有点大,太重了。
相关推荐
1. **定时器(Timer)**:在C#中,可以使用`System.Timers.Timer`或`System.Threading.Timer`来创建一个定时器。当设定的时间到达时,定时器会触发一个事件,从而检查程序是否还在执行。如果程序仍在运行,就可能会...
以下将详细解释如何在Python中使用`threading`获取线程函数的返回值。 首先,我们需要理解`threading`模块中的核心类和方法。`Thread`类是创建线程的基础,它可以接受一个`target`参数,这个参数是线程要执行的函数...
`wait(timeout=None)`方法的超时参数`timeout`可以设置等待的最长时间,超时后返回`False`,否则返回`True`。当使用`RLock`时,`wait()`会避免直接调用`release()`,而是使用`RLock`的内部接口来确保正确地解锁和...
timer.Change(Timeout.Infinite, Timeout.Infinite); } static void DisplayTime(object state) { Console.WriteLine($"Timer triggered! State: {state}"); } } ``` 在这个例子中,我们创建了一个`Timer`,...
这个压缩包 "简单的定时任务 .NETCore3.1 WorkerService.zip" 包含了一个名为 "NetCoreWorkerService-master" 的项目,该项目是一个示例,展示了如何在 Windows 和 Linux 上使用 Worker Service 来执行定期任务。...
.Net 3.5 下使用的 System.Threading.Tasks。 安装完成后,添加引用时只需要在安装目录 C:\Program Files (x86)\Microsoft Reactive Extensions\Redist\DesktopV2 下找到 System.Threading.dll,添加即可
使用threading建立了一个多线程的基础程序 使用threading建立了一个多线程的基础程序 使用threading建立了一个多线程的基础程序 使用threading建立了一个多线程的基础程序 使用threading建立了一个多线程的基础...
`threading`模块提供的同步原语如锁、条件变量、信号量等,可以帮助解决这些问题,确保数据的一致性。 **5. 注意事项** - 虽然`threading`模块提供了丰富的功能,但在某些场景下,如CPU密集型任务,多线程并不能...
这个类的实例可能会被`WorkerThread`在`DoWork`方法中使用,确保这些操作不会阻塞UI线程。 `AssemblyInfo.cs`是C#项目的元数据文件,包含关于程序集的信息,如版本、版权和公钥等。 `.csproj`和`.sln`文件是项目和...
首先,确保正确使用锁机制是解决此类问题的基础。正确使用锁意味着,在需要同步的代码块执行前获取锁,并在执行完毕后立即释放锁。这样的操作可以有效减少死锁和竞争条件的出现。具体实现时,可以利用C#的lock关键字...
C#多线程操作控件threading的使用 在C#中,多线程操作控件是一个常见的问题。由于控件是主线程创建的,因此不能直接从另一个线程访问。这篇文章将探讨如何使用threading来实现多线程操作控件。 首先, let's 看一...
`threading.Timer`的基本使用方法是创建一个Timer对象,传入两个参数:间隔时间和回调函数。间隔时间是定时器启动后等待的秒数,回调函数是在等待时间结束后被调用的函数。例如: ```python import threading def ...
System.Threading.LockRecursionException是.NET框架中线程同步时出现的一个异常,它发生在尝试对同一个线程对象进行多次锁定时。在C#中,当一个线程试图获取一个已经被它自身持有的锁时,就会抛出...
我在做一个兼容WindowsXP项目时用到,用梯子到外面找来的。 由于 .NET 3.5下并没有官方实现的 Task 库,所以,是通过 VS 中 NuGet 取得的 非官方 实现的 Task 库,调用接口与官方.NET 4.0 后的应该是差不多的。
1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3>T2,那说明开启一个...
t = threading.Thread(target=worker) t.start() ``` 在上述代码中,我们创建了一个新的线程`t`,并将`worker`函数作为线程的目标。调用`start`方法启动线程,使得`worker`函数在新线程中执行。 `threading`库还...
Python 中的多线程编程是使用 Threading 模块实现的,该模块提供了丰富的功能来创建和管理线程。在学习 Threading 模块之前,需要了解 Python 的基础知识,包括函数、类、对象等概念。 Threading 模块 Threading ...
### C++ Threading:一种通用编程方法 #### 概述 C++ threading 是一个重要的主题,尤其是在现代软件开发中,多线程编程已经成为提高程序性能、实现并发处理的关键技术之一。本文将根据提供的资料深入探讨关于C++ ...
本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③...