Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 1, 2013 14:34:47

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

Всем доброго!
Пытаюсь разобраться с потоками. Есть следующий пример:

# -*- coding: utf-8 -*-
import threading
class myThread(threading.Thread):
    def __init__(self, x, ip):
        threading.Thread.__init__(self)
        self.x = x
        self.ip = ip
    def run(self):
        for i in xrange(10):
            print self.x, self.ip
t1 = myThread("obj1", "192.168.1.1")
t2 = myThread("obj2", "192.168.1.2")
t3 = myThread("obj3", "192.168.1.3")
t1.start()
t2.start()
t3.start()
Цель его выполнения 10 раз выводить текст:
obj1 192.168.1.1
obj1 192.168.1.2
obj1 192.168.1.3
Но вместо этого компилятор выводит следующее:
obj3obj1obj2   192.168.1.3192.168.1.1192.168.1.2
obj3obj1obj2   192.168.1.3192.168.1.1192.168.1.2
И второй момент скрипт не завершается



Python 2.7.3
Pyside 1.1.2

Офлайн

#2 Апрель 1, 2013 16:19:17

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

Операция print в питоне не потокобезопасна

http://stackoverflow.com/questions/3029816/how-do-i-get-a-thread-safe-print-in-python-2-6



Офлайн

#3 Апрель 2, 2013 00:31:14

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

Cover Story
Может лучше через очереди сделать? модуль Queue, посмотрите примеры



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Апрель 2, 2013 08:33:23

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

О, спасибо буду разбираться!



Python 2.7.3
Pyside 1.1.2

Офлайн

#5 Апрель 2, 2013 10:13:12

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

import threading
lock = threading.Lock()
def myPrint(*arg):
    lock.acquire()
    try:
        print arg
    finally:
        lock.release()
class myThread(threading.Thread):
    def __init__(self, x, ip):
        threading.Thread.__init__(self)
        self.x = x
        self.ip = ip
    def run(self):
        for i in xrange(10):
            myPrint( self.x, self.ip)
t1 = myThread("obj1", "192.168.1.1")
t2 = myThread("obj2", "192.168.1.2")
t3 = myThread("obj3", "192.168.1.3")
t1.start()
t2.start()
t3.start()



Офлайн

#6 Апрель 2, 2013 10:38:35

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

Да скорее вы правы с оператором print

# -*- coding: utf-8 -*-
import threading, csv
class myThread(threading.Thread):
    def __init__(self, x, ip):
        threading.Thread.__init__(self)
        self.x = x
        self.ip = ip
    def run(self):
        for i in xrange(10):
            ss = [self.x, self.ip]
            writ.writerow(ss)
            #print self.x, self.ip
ff = open("invent_r.txt", "wb")
writ = csv.writer(ff, delimiter="\t")
t1 = myThread("obj1", "192.168.1.1")
t2 = myThread("obj2", "192.168.1.2")
t3 = myThread("obj3", "192.168.1.3")
t1.start()
t2.start()
t3.start()
ff.close()
Вот пример который отработал правильно.
Но мне кажется сам пример не верный. Как writ.writerow(ss) отработал я же writ не объявлял в своем классе.



Python 2.7.3
Pyside 1.1.2

Отредактировано Cover Story (Апрель 2, 2013 10:39:15)

Офлайн

#7 Апрель 2, 2013 12:42:58

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и последовательный вывод

sp3 Спасибо большое, сразу не заметил!



Python 2.7.3
Pyside 1.1.2

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version