Python 如果执行得太快线程会干扰
Python Threads Intefere if Executed Too Quickly
我有许多线程是并行执行的,因为线程通常是用来执行的:D
除非我放慢他们的速度,否则他们往往会相互操纵,给彼此的 space 写信。因此,当我打印一条语句时,我在某些线程中看到了 "echo"(不是编码术语,而是文字回显)。
当我放慢他们的速度时,不会出现木偶戏。
这是我在终端上得到的一个例子,当这些虚拟账户 运行:
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, nine
Robinia6424: day_2, Wed Jun 10 03:32:53 2015, four
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, fifteen
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, thirteen
Mekushishifu643: day_7, Wed Jun 10 03:32:53 2015, two
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, eleven
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, six
Mekushishifu643: day_2, Wed Jun 10 03:32:53 2015, three
**Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, ten
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten**
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, fourteen
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, sixteen
DaDaFurstig6304: day_7, Wed Jun 10 03:32:53 2015, five
DoraDiggle5529: day_7, Wed Jun 10 03:32:53 2015, one
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, seven
注意标记为 'ten' 的回声。
我真的希望我不必 post 我的代码,因为大多数 python 程序员可能会在没有我的 300 行 类 正在 post 编辑这里。
类 相当大,所以我不会在这里打扰它们 post。我怀疑这是我只是没有意识到的常见问题,例如处理器问题?
造成这种情况的常见原因是什么?如何在不使用时间延迟的情况下避免这种情况?
这是标准的线程行为。不要使用具有共享输出的线程。 Python 的线程是原子的:这意味着如果你给它们一个隔离的环境,它们就不会给你带来问题。如果你让他们访问正在动态修改的共享数据,或者写入共享对象或缓冲区,那么你就会遇到这样的问题。
问题是你线程使用不当。写入每个线程内的单独缓冲区,并在线程完成后合并结果。
这些线程是否正在访问共享数据 - 即相同的一个或多个变量?如果是这样,并且如果数据不受 locks/synchronization 的保护,那么它很容易受到线程 race conditions. This is true in any concurrent programming environment, not just Python. Check out this nice summary of Python synchronization 的影响。
我有许多线程是并行执行的,因为线程通常是用来执行的:D
除非我放慢他们的速度,否则他们往往会相互操纵,给彼此的 space 写信。因此,当我打印一条语句时,我在某些线程中看到了 "echo"(不是编码术语,而是文字回显)。
当我放慢他们的速度时,不会出现木偶戏。
这是我在终端上得到的一个例子,当这些虚拟账户 运行:
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, nine
Robinia6424: day_2, Wed Jun 10 03:32:53 2015, four
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, fifteen
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, thirteen
Mekushishifu643: day_7, Wed Jun 10 03:32:53 2015, two
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, eleven
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, six
Mekushishifu643: day_2, Wed Jun 10 03:32:53 2015, three
**Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, ten
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten
Meikitotokiku83: day_7, Wed Jun 10 16:33:03 2015, ten**
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, fourteen
Meikitotokiku83: day_7, Wed Jun 10 03:32:53 2015, sixteen
DaDaFurstig6304: day_7, Wed Jun 10 03:32:53 2015, five
DoraDiggle5529: day_7, Wed Jun 10 03:32:53 2015, one
Meikitotokiku83: day_2, Wed Jun 10 03:32:53 2015, seven
注意标记为 'ten' 的回声。
我真的希望我不必 post 我的代码,因为大多数 python 程序员可能会在没有我的 300 行 类 正在 post 编辑这里。
类 相当大,所以我不会在这里打扰它们 post。我怀疑这是我只是没有意识到的常见问题,例如处理器问题?
造成这种情况的常见原因是什么?如何在不使用时间延迟的情况下避免这种情况?
这是标准的线程行为。不要使用具有共享输出的线程。 Python 的线程是原子的:这意味着如果你给它们一个隔离的环境,它们就不会给你带来问题。如果你让他们访问正在动态修改的共享数据,或者写入共享对象或缓冲区,那么你就会遇到这样的问题。
问题是你线程使用不当。写入每个线程内的单独缓冲区,并在线程完成后合并结果。
这些线程是否正在访问共享数据 - 即相同的一个或多个变量?如果是这样,并且如果数据不受 locks/synchronization 的保护,那么它很容易受到线程 race conditions. This is true in any concurrent programming environment, not just Python. Check out this nice summary of Python synchronization 的影响。