【问题标题】:Delayed start of tasks with Python multiprocessing使用 Python 多处理延迟启动任务
【发布时间】:2015-09-17 14:36:06
【问题描述】:

最近一直在研究Python的多处理能力,遇到如下代码的问题

import syslog
from multiprocessing import Pool
def launcher(i):
    time.sleep(i)
    syslog.openlog( 'test', 0, syslog.LOG_LOCAL4 )
    syslog.syslog( '{} {}'.format(i,datetime.now()))

if __name__ == '__main__':
    pool=Pool(8)
    pool.map(launcher,range(1,3000))
    pool.close()
    pool.join()

其背后的想法很简单:我需要在我的系统日志中获得稳定的消息流(每秒一条消息),但我想通过多处理池在 8 个工作进程中生成它。

在我的系统日志(我的 Ubuntu 上的本地 /var/log/syslog)中,我有以下内容

Sep 17 17:17:57 test: 1 2015-09-17 17:17:57.225699
Sep 17 17:17:58 test: 2 2015-09-17 17:17:58.226957
Sep 17 17:18:00 test: 3 2015-09-17 17:18:00.229196
Sep 17 17:18:03 test: 4 2015-09-17 17:18:03.232390
Sep 17 17:18:07 test: 5 2015-09-17 17:18:07.236587
Sep 17 17:18:12 test: 6 2015-09-17 17:18:12.241737
Sep 17 17:18:18 test: 7 2015-09-17 17:18:18.247926
Sep 17 17:18:25 test: 8 2015-09-17 17:18:25.255169
Sep 17 17:18:29 test: 9 2015-09-17 17:18:29.258229
Sep 17 17:18:33 test: 10 2015-09-17 17:18:33.263454
Sep 17 17:18:42 test: 64 2015-09-17 17:18:42.272675
Sep 17 17:18:52 test: 33 2015-09-17 17:18:52.283012
Sep 17 17:19:01 test: 11 2015-09-17 17:19:01.290070
Sep 17 17:19:02 test: 12 2015-09-17 17:19:02.259826

一是流动不均匀,二是乱序。

如果是这样,可能是什么原因?

为什么 linux 进程调度器与 Python 多处理一样工作?

有什么办法可以通过多处理来解决我的任务吗?

【问题讨论】:

    标签: python multiprocessing python-multiprocessing


    【解决方案1】:

    即使操作系统只对您的程序进行实时调度,您也不会在每一秒后收到统一的消息:

    1. 拿 8 个厨房计时器和一堆便利贴。
    2. 编号 2999 将其 1 粘贴到 2999。
    3. 拿一个计时器和一张便利贴,将时间设置为便利贴上的数字并放在一边。
    4. 重复 3 直到计时器用完
    5. (如果你的速度非常快,亚秒级)你有 8 个计时器从 [1, 2, 3 ,4, 5, 6, 7, 8] 开始倒计时
    6. 等一下
    7. 现在您的第一个计时器应该停止,重复第 3 步。
    8. 您现在有 8 个计时器正在运行

    顺序是

    [9, 1, 2, 3, 4, 5, 6, 7]
    [8, 10, 1, 2, 3, 4, 5, 6]
    [7, 9, 11, 1, 2, 3, 4, 5]
    [6, 8, 10, 12, 1, 2, 3, 4]
    [5, 7, 9, 11, 13, 1, 2, 3]
    [4, 6, 8, 10, 12, 14, 1, 2]
    [3, 5, 7, 9, 11, 13, 15, 1]
    [2, 4, 6, 8, 10, 12, 14, 16]
    #Notice that for the next timer to go off, you have to wait 2 seconds, not 1!
    [17, 2, 4, 6, 8, 10, 12, 14]
    [15, 18, 2, 4, 6, 8, 10, 12]
    ...
    [3, 6, 9, 12, 15, 18, 21, 24]
    #3 seconds to wait, not 1!
    [25, 3, 6, 9, 12, 15, 18, 21]
    ...
    [4, 8, 12, 16, 20, 24, 28, 32]
    

    编辑:

    我猜你为什么会如此快地经历 1、2、3 的等待,这可能是因为你的 8 个工作人员同时尝试对同一个 syslog 执行 IO。我认为那里有一些障碍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多