2015-01-22 3 views
1

Я создал два потока, каждый из которых запускал разные функции. То, что я пытался достичь, - это то, что если первая нить заканчивается, вторая также должна заканчиваться (я попытался достичь ее с помощью глобальной переменной) Как только обе нити заканчиваются, эта же процедура должна продолжаться. Сценарий работает не так, как ожидалось.Многопоточность в python с использованием параллельных потоков

Я использую Linux - Centos и питона 2,7

#!/usr/bin/python 

import threading 
import time 
import subprocess 
import datetime 
import os 
import thread 


command= "strace -o /root/Desktop/a.txt -c ./server" 
final_dir = "/root/Desktop/" 
exitflag = 0 
# Define a function for the thread 
def print_time(*args): 
    os.chdir(final_dir) 
    print "IN first thread" 
    proc = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    proc.wait(70) 
    exitflag=1 

def print_time1(*args): 
    print "In second thread" 
    global exitflag 
    while exitflag: 
     thread.exit() 
     #proc = subprocess.Popen(command1,shell=True,stdout=subprocess.PIPE, sterr=subprocess.PIPE) 



# Create two threads as follows 

    while (1): 
     t1=threading.Thread(target=print_time) 
     t1.start() 
     t2=threading.Thread(target=print_time1) 
     t2=start() 
     time.sleep(80) 
     z = t1.isAlive() 
     z1 = t2.isAlive() 
     if z: 
      z.exit() 
     if z1: 
      z1.exit() 
     threading.Thread(target=print_time1).start() 
     threading.Thread(target=print_time1).start() 
     print "In try" 

Где я буду неправильно?

ответ

1

Вы можете создать объект для совместного использования состояния, а зависящий поток проверить это состояние. Что-то вроде:

import threading 
import time 
import datetime 

class Worker1(threading.Thread): 
    def __init__(self, state): 
     super(Worker1, self).__init__() 
     self.state = state  

     def run(self): 
      print_time_helper("Worker1 Start") 
     time.sleep(4) 
     print_time_helper("Worker1 End") 
     self.state.keepOnRunning = False 

class Worker2(threading.Thread): 
    def __init__(self, state): 
     super(Worker2, self).__init__() 
     self.state = state 

    def run(self): 
     while self.state.keepOnRunning: 
      print_time_helper("Worker2") 
      time.sleep(1) 

class State(object): 
    def __init__(self): 
     self.keepOnRunning = True   

def main(): 
    state = State() 

    thread1 = Worker1(state) 
    thread2 = Worker2(state) 

    thread1.start() 
    thread2.start() 

    thread1.join() 
    thread2.join() 

def print_time_helper(name): 
    print "{0}: {1}".format(name, datetime.datetime.now().time().strftime("%S")) 

, который будет что-то вроде этого (цифры показывают текущее время в секундах):

Worker1 Start: 39 
Worker2: 39 
Worker2: 40 
Worker2: 41 
Worker2: 42 
Worker1 End: 43 

Однако, это немного упрощенным для большинства ситуаций. Возможно, вам лучше использовать очереди сообщений - this - хорошее введение.

+0

это непосредственно дает мне Worker1 Конец: 25 – user2087340

0

Использовать threading.Event вместо int и ждать его установки.

Также ваша ошибка кажется неправильной в print_time1, потому что цикл while никогда не будет запущен, так как exitflag изначально равен 0, но даже если он равен 1, он все равно сразу выйдет немедленно. На самом деле это ничего не ждет.

Смежные вопросы