поток в Python против C # против Ruby - PullRequest
3 голосов
/ 26 июля 2011

Я думаю, что нашел что-то, что могут сделать C # и Ruby, но Python не может

в C #:

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

в рубине:

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?

Ответы [ 4 ]

2 голосов
/ 26 июля 2011

В Python:

import threading

def action(arg):
    print arg

for i in range(100):
    threading.Thread(target=action, args=(i,)).start()
2 голосов
/ 26 июля 2011

Ну, на самом деле вы можете:

>>> import threading
>>> def target():
...     print 123
...
>>> threading.Thread(target=target).start()
123

Ваш пример будет выглядеть следующим образом:

>>> def target(i):
...     print i
...
>>> for i in xrange(100):
...     threading.Thread(target=target, args=(i,)).start()
...
0
1
2
3
<and so on>
1 голос
/ 26 июля 2011

Отредактировано еще раз:

Я думаю, что нашел что-то, что могут сделать C # и Ruby, но Python не может

Нет, это имеет повторяющиеся числа и выглядит так же, как ваш код Ruby / C #.

import threading
import sys

for i in xrange(100):
    threading.Thread(target=lambda: sys.stdout.write('{0}\n'.format(i))).start()

-

14
15
17
17
18
19
20
1 голос
/ 26 июля 2011

Если вы хотите, чтобы разные потоки иногда видели одно и то же значение 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
...