我需要有关Action Queue中变量生命周期的建议 在多线程ASP.NET Web API环境中。
我的一个API接收更新数据库和发送电子邮件的请求。但是,发送电子邮件需要花费很长时间来处理,我决定使用下面的example将该部分包围在生产者/消费者队列中。
class TestDownload(unittest.TestCase):
def setUpClass(cls):
config.fs = True
但下面的代码是我不确定垃圾收集器是否会在UpdateTask完成时清理email_address的值。
Ran 0 tests in 0.004s
FAILED (errors=1)
Failure
Traceback (most recent call last):
File "/opt/anaconda3/lib/python3.5/unittest/suite.py", line 163, in _handleClassSetUp
setUpClass()
TypeError: setUpClass() missing 1 required positional argument: 'cls'
答案 0 :(得分:0)
由于List是一个引用类型,一旦没有任何引用它就会被垃圾收集。您将列表传递给SendEmail方法,它将至少存在直到SendEmail结束(假设您没有在其他地方传递列表或将其存储在某个字段/属性中)。
更一般的指示:
但是,请注意通过访问多个线程中的列表来创建竞争条件。您也可以考虑使用ConcurrentQueue而不是Queue。
最后,如果这是ASP.NET应用程序代码的一部分,我会确保在响应请求之前完成队列,或者让我卸载长时间运行队列的服务(作业服务器概念)。我并不精通有关线程超过请求生命周期的风险,但我认为ASP可以搞乱它,导致在没有完成的情况下丢失排队的工作。