【问题标题】:How to make Python do a loop for all items in list at the same time?如何让 Python 同时对列表中的所有项目进行循环?
【发布时间】:2012-07-03 13:59:30
【问题描述】:

我有一个列表,我正在尝试对列表中的每个项目进行循环,同时进行。

我尝试过使用此代码:

thelist = ['first', 'second', 'third']

def loop():
    while True:
        for x in thelist:
            x = str(x)
            time.sleep(5)
            do_stuff_that_includes_x()

但它会按照thelist 中的排序一个一个完成循环中的内容。

我希望它同时处理thelist 中的所有项目

提前致谢。

【问题讨论】:

  • 如果你真的想要,使用线程。但是,如果您解释为什么要这样做,我们也许可以提供更简单的替代方案。
  • 你能告诉你你到底想做什么吗?
  • “同时”是什么意思? Python 程序是顺序的,它们会一步一步地执行代码,除非你开始使用threads。一般来说,循环的全部意义在于重复执行循环体,即“一个接一个”地执行循环逻辑所需的重复次数。
  • 比如我想printthelist中的每一项都在同一时刻,而不是一步一步。我希望thelist 中存在的所有项目同时启动它们的进程(并行)。

标签: python list loops for-loop python-2.7


【解决方案1】:

正如 vossad01 在 cmets 中所指出的,您的代码在循环内有 5 秒的延迟。这将导致列表中任意两个项目之间有 5 秒的延迟。如果您取消 5 秒延迟,您的消息将几乎即时发送到列表中的所有房间。

thelist = ['first', 'second', 'third']

def loop():
    while True:
        for x in thelist:
            x = str(x)
            do_stuff_that_includes_x() 

        time.sleep(5)

【讨论】:

    【解决方案2】:

    首先,由于全局解释器锁 (GIL),多线程并行化不会提高性能。因此,如果您出于性能原因这样做,则需要查看multiprocessing 模块。有关使用进程池的 map 成员来完成此操作的示例,请参见 how do I parallelize a simple python loop?

    旁注:重新分配迭代变量 (x) 是不好的形式。此外,由于您希望并行执行,因此如果您可以在 x 上设置 do_stuff_that_includes_x(​​) 参数化将是最简单的。

    【讨论】:

    • 不,我不是想提高性能。假设我有 3 个账户,我希望这三个账户同时向一个目标账户发送消息,而不是一个一个发送。
    • 您确实意识到没有“同时”之类的东西,除非您发送一条消息?否则,您基本上需要至少 3 个核心(一个专用于每个帐户)完全同步,这不是事情的工作方式。也许您需要提供更多信息来说明您要完成的工作?
    • 嗯,我在某些服务器上为聊天室制作了一个机器人。该机器人使用 5 个连接(5 个帐户)留在聊天室并每隔几分钟发布一条消息(以避免被自动踢。),我想要将这些机器人设置在几个聊天室中,而不仅仅是一个,我希望他们发布每个房间的消息同步。我在上面发布的循环是一个接一个,这意味着:帐户在 5 秒后在 first 房间发布消息。帐户在 5*2 秒后在 second 房间发布消息。 // // // 5*3 秒后进入 第三个 房间。等等..希望我这次提供了足够的细节
    • 为什么不将 time.sleep(5) 移到 while 循环内,而是移到 for 循环外。然后它将全部完成,等待 5 秒,然后全部完成,等待......
    • 试过了,但仍然.. 5 个帐户在第一个房间发布消息,然后在第二个房间发布消息,依此类推。
    【解决方案3】:

    我认为你需要多处理:

    import time
    
    def work(x):
        x = str(x)
        time.sleep(5)
        print x
    #   do_stuff_that_includes_x()
    
    thelist = ['first', 'second', 'third']
    from multiprocessing import Pool
    p = Pool( len( thelist ) )
    p.map( work, thelist )
    

    【讨论】:

      【解决方案4】:

      使用* 运算符一次解压整个列表

      do_stuff_that_includes_x(*x)
      

      【讨论】:

      • 如何对x 中的每个元素执行一些功能?我x 是我的列表,我将*x 作为参数传递给函数,如何编写一个函数将列表x 中的每个元素乘以10?
      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2021-09-06
      • 2021-05-08
      • 2013-03-21
      • 2011-01-30
      • 1970-01-01
      相关资源
      最近更新 更多