Найти - Пользователи
Полная версия: Потоки и последовательный вывод
Начало » Python для новичков » Потоки и последовательный вывод
1
Cover Story
Всем доброго!
Пытаюсь разобраться с потоками. Есть следующий пример:
# -*- 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
И второй момент скрипт не завершается
Soteric
Операция print в питоне не потокобезопасна

http://stackoverflow.com/questions/3029816/how-do-i-get-a-thread-safe-print-in-python-2-6
JOHN_16
Cover Story
Может лучше через очереди сделать? модуль Queue, посмотрите примеры
Cover Story
О, спасибо буду разбираться!
sp3
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()
Cover Story
Да скорее вы правы с оператором 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 не объявлял в своем классе.
Cover Story
sp3 Спасибо большое, сразу не заметил!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB