微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中的线程vs C#vs Ruby

我想我已经找到了C#和Ruby可以做的东西,但Python不能

在C#中:

for (var i = 0; i < 100; i++)
    new Thread(() => { Console.Write(i+" "); }).Start();
Console.ReadLine();

在Ruby中:

for i in 0...100
    Thread.start{
        print i + ''
    }
end

gets

有任何想法吗?你能在python中重写上面的代码吗?输出应该类似于C#和Ruby:具有重复的数字.

编辑
输出是100次打印,重复数字.如果您定义一个类或一个方法,您只能获得100次打印而没有重复的数字.我知道获取重复数字是没有意义的,我只想使用python实现与C#和ruby相同的效果.

C#的示例输出

3 3 3 3 5 7 8 8 10 10 12 12 13 14 17 17 17 18 20 20 22 23 24 24 25 28 28 29 29 3
1 31 33 33 34 36 38 38 38 41 41 41 42 44 45 45 46 49 49 50 50 52 52 55 56 56 56
58 59 59 60 61 64 64 64 66 66 67 68 69 72 72 72 73 74 76 76 78 78 81 81 82 83 84
 84 86 86 87 89 89 90 93 94 94 95 95 97 97 99 99 100

Ruby的示例输出

99999999999999999999999999999999999999999999999999999999999999999999999999999999
99999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999

为什么我想要重复的数字:
C#和ruby代码输出有重复的数字.那是因为,主线程正在改变i的值,因此一些子线程可能会打印相同的数字.主线程和子线程引用相同的变量i.
有时这很有用:主线程更改变量,子线程全部获取更新变量.
但是我们怎么能用Python做到这一点?

解决方法:

如果你希望不同的线程有时看到i的相同值,那么你需要传入一个可变对象并改变它:

import threading

def action(arg):
    print arg[0],

mutable = [0]
for i in range(100):
    mutable[0] = i
    threading.Thread(target=action, args=(mutable,)).start()

这与您是否为线程定义单独的类没有任何关系,它完全取决于您如何在线程之间共享值.全局变量会以同样的方式破坏您的线程.

样本输出

0 1 2 3 5 5 6 8 9 9 11 11 12 1314 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3
0 31 32 33 34 35 36 37 39 39 40 41 43 44 44 45 46 47 48 49 50 51 53 53 54 55 56
5758 59 60 61 62 64 65 6666 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 8
4 85 86 87 89 90 90 92 93 93 94 95 96 9898 99

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐