2016-02-25 2 views
0

Я новичок в потоковом режиме. Я написал эту программу, где я пытаюсь выполнить две разные функции с помощью потоков. Я пытался запускать различные функции, используя один и тот же поток, путем изменения target и args Parameters один за другие:Использование той же темы с различными функциями в python

import threading 
import datetime 
import Queue 

a=Queue.Queue() 
b=Queue.Queue() 
q=Queue.Queue() 

class MyThread(threading.Thread): 
    def __init__(self,q): 
     threading.Thread.__init__(self) 
     self.que=q 
     t1=threading.Thread(target=self.prints,args=(4,)) 
     t2=threading.Thread(target=self.printy,args=(6,self.que,)) 
     t1.start() 
     t2.start() 
     item=self.que.get() 
     print(item) 
     print "*"*30 
     it=item*2 
     print(it) 
     t1.join() 

    def main(self): 
     t3=threading.Thread(target=self.prints,args=(3,)) 
     t4=threading.Thread(target=self.printy,args=(5,self.que,)) 
     t3.start() 
     t4.start() 
     item=self.que.get() 
     print(item) 
     print "#"*30 
     it=item*2 
     print(it) 
     t2=threading.Thread(target=self.prints,args=(8,)) 
     t4=threading.Thread(target=self.prints,args=(7,)) 
     t2.start() 
     t4.start() 
     t2.join() 
     t3.join() 
     t4.join() 

    def prints(self,i): 
     while(i>0): 
      print "i="+str(i)+" "+str(datetime.datetime.now().time())+"\n" 
      i=i-1 

    def printy(self,i,b): 
     r=0 
     while(i<10): 
      print "i="+str(i)+" "+str(datetime.datetime.now().time())+"\n" 
      i=i+1 
      r=r+i 
     self.que.put(r) 

if __name__=='__main__': 
    MyThread(a).main() 

Он выполнен без метания какой-либо ошибки, а также дал мне выход, я хотел, но я хотел бы знать, если :

  1. Это правильный способ сделать это? В противном случае, Каков правильный способ запуска нескольких функций с использованием того же потока, что и многократно используемый элемент ?.
  2. В простой программе, подобной этому, это кажется достаточно безвредным, но как насчет более сложных программ с множеством функций? Любые потенциальные проблемы, которые могут возникнуть?

ответ

1
from multiprocessing import Pool 

def f(x): 
    return x*x*x 

def b(x): 
    return x*x  

if __name__ == '__main__': 
    p = Pool(5) 
    print(p.map(f, [1, 2, 3])) 
    print(p.map(b, [1, 2, 3])) 

>> [1, 8, 27] 
>> [1, 4, 9] 

Пожалуйста, обратите внимание, что вы не можете запустить этот пример в IPython сессии!

редактировать с резьбой:

import threading 
import queue 
q = queue.deque() 


def niceFunc1(data): 
    return reversed(data) 

def niceFunc2(data): 
    return "Hey there :%s" % data 



q.append((niceFunc1,"gude")) 
q.append((niceFunc1,"test")) 
q.append((niceFunc2,"test")) 
q.append((niceFunc2,"123")) 


def worker(): 
    for each in q: 
    print(each[0](each[1])) 


t=threading.Thread(target=worker) 
t.start() 

t2=threading.Thread(target=worker) 
t2.start() 
+0

Таким образом, это может быть сделано только с помощью класса многопроцессорного и не резьб класс? Я хотел знать, есть ли безопасный способ сделать это, используя потоки. –

+0

У вас может быть очередь, где поток вытягивает кортеж (функция, данные). Затем вы можете выполнить функцию с предоставленными данными. – enthus1ast

+0

Не могли бы вы немного рассказать о том же примере? –