Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多个任务一个线程,而每个任务多个线程。睡眠线程是否影响服务器的性能?_Multithreading_Celery_Production Environment - Fatal编程技术网

Multithreading 多个任务一个线程,而每个任务多个线程。睡眠线程是否影响服务器的性能?

Multithreading 多个任务一个线程,而每个任务多个线程。睡眠线程是否影响服务器的性能?,multithreading,celery,production-environment,Multithreading,Celery,Production Environment,a我有一个任务,我希望服务器每X小时为每个用户~5000个用户执行一次。是否最好: 1-为执行任务的每个用户创建一个工作线程并睡眠X小时,然后重新启动,其中每个任务在随机时间内运行,以便大多数任务每时每刻都在睡眠 2-创建一个线程,在用户之间循环,并为每个用户执行任务,然后重新启动,即使这需要X小时以上 b如果使用计划1,休眠线程是否会影响服务器的性能? c如果答案是肯定的,休眠线程是否与执行任务的线程具有相同的效果 请注意,此服务器不仅仅用于此任务。它用于与~5000个客户的所有通信。关于您的

a我有一个任务,我希望服务器每X小时为每个用户~5000个用户执行一次。是否最好:

1-为执行任务的每个用户创建一个工作线程并睡眠X小时,然后重新启动,其中每个任务在随机时间内运行,以便大多数任务每时每刻都在睡眠

2-创建一个线程,在用户之间循环,并为每个用户执行任务,然后重新启动,即使这需要X小时以上

b如果使用计划1,休眠线程是否会影响服务器的性能? c如果答案是肯定的,休眠线程是否与执行任务的线程具有相同的效果


请注意,此服务器不仅仅用于此任务。它用于与~5000个客户的所有通信。

关于您的问题,没有足够的详细信息来提供完整的答案。但是,根据您提供的信息,我将:

创建一个timer.timer 设置一个间隔,该间隔将是处理一批5000个用户之间的时间间隔 然后说您要执行的方法/任务称为UpdateUsers: 当计时器计时时,在UpdateUsers方法回调中: 1.停止计时器 2.循环并为每个用户执行任务3。启动计时器


通过这种方式,您可以确保为每个用户执行任务,并且如果总时间超过X小时,则不会出现重叠。每次都会发生更新,其中Y是为计时器设置的时间间隔。此外,这最多使用一个线程,具体取决于服务器/服务的编码方式。

睡眠线程通常不会影响CPU的使用。它们每个都消耗1MB的堆栈内存。这对于许多线程来说都不是什么大问题。这对于5000个线程来说是一件大事

有一个线程或计时器专门用于触发每小时工作。您可以每小时处理一次用户。如果需要,可以使用并行性。使用Parallel.ForEach或任何其他您喜欢的技术处理用户


无论您选择的是线程还是计时器,对CPU的使用都没有任何意义。做最适合您使用的应用程序。

停止计时器并不能确保将来可以调用回调。任意多个回调已经可以排队了。我的意思是停止回调方法中的计时器。我不明白什么是不正确的?在你停止计时器后,仍然可以调用回调。计时器不能防止回调的并发调用。好的,我明白了。但是假设你在一个类中有这个计时器和回调函数;服务实例化一个类,计时器在构造函数或StartTimer方法中启动,这无关紧要。一次只能有一个实例、一个计时器、一个线程调用该方法。为什么并发访问会成为一个问题/风险?计时器事件会被发布到线程池。不是一根线而是任意多根线。如果同时调用,大多数代码都不安全。我同意你大部分的回答。我只想指出这一个细节。