2016-11-21 2 views
2

У меня есть следующий код Python:Python не может убить процесс

main(): 
    t1 = Thread(target=consumer, args=(q,)) 

    t2 = Thread(target=server, args=(q,)) 
    t1.start() 
    t2.start() 

def server(q): 
    while(1): 

    # Produce some data 
    data = s.recv(1000) 
    q.put(data) 
def consumer(in_q): 
    while True: 
     data = in_q.get() 

     if(data.__len__() >0): 
      pieces = data.split("\t") 

      if 'L' in pieces[0]: 
       l = multiprocessing.Process(target=fun1()) 
       l.start() 
       n.terminate() 
       n.join() 

      elif 'N' in pieces[0]: 
       n = multiprocessing.Process(target=fun2()) 
       n.start() 
       l.terminate() 
       l.join() 
def func1(): 
while(1): 
    //Do something 


def func2(): 
while(1): 
    //Do something code here 

Я хочу, чтобы убить или остановить процесс «л», когда «п» работает и наоборот. Я пробовал .terminate(), но я не мог убить процесс.

Является ли многопроцессорным способом правильным способом? Может ли кто-нибудь сказать мне, пожалуйста, что мне не хватает? Любые намеки приветствуются.

+0

Посмотрите на это: http://stackoverflow.com/help/mcve Ваш пример почти прав, но вам не хватает нескольких вещей, необходимых вам. Удачи. –

+1

В вашем коде: s никогда не определено, q никогда не определено, n не определено в блоке «if L», l не определено в блоке «If N». У вас есть рабочий пример, чтобы мы могли рассуждать. – Setop

ответ

1

Решение вашей проблемы зависит от материала, что ваши процессы l и n делают (=> Ваши функции func1 и func2.

В вашем примере вы имеете while функцию в каждом, так что можно использовать контролировать свой процесс. в вашем случае вы можете злоупотреблять multiprocessing.event. он предназначен для приостановки процессов, не прекращать их. Но она должна работать в соответствии с требованиями.

import multiprocessing as mp 
def consumer(in_q): 
    #create events for communication with processes, initialized as 'False' 
    event_n = mp.event() 
    event_l = mp.event() 
    while True: 
     data = in_q.get() 

     if(data.__len__() >0): 
      pieces = data.split("\t") 

      if 'L' in pieces[0]: 
       l = multiprocessing.Process(target=func1, args=event_l) 
       l.start() 
       event_n.set() #set True and signal process n to stop 
       n.join() 

      elif 'N' in pieces[0]: 
       n = multiprocessing.Process(target=func2, args=event_n) 
       n.start() 
       event_l.set() #set True and signal process l to stop 
       l.join() 

def func1(event_l): 
    while(!event_l): #do as long event_l == False 
     //Do something 
    event_l.clear() #set false 
    return 


def func2(event_n): 
    while(!event_n): #do as long event_n == False 
     //Do something code here 
    event_n.clear() #set false 
    return 

Однако ваше смешивание потоков и процессов questi onable. Ваш server и ваш consumer находятся в одном процессе, а ваши func1 и func2 - это отдельные процессы. Это ваше намерение?

+0

Спасибо за ваш ответ. Нет, это было не намеренно. Сначала я пытался с другим процессом, и когда это не сработало, я попытался в том же процессе. Не могли бы вы подробно рассказать о многопроцессорности. Так как я новичок. – user338409

+0

Объект-событие (то же самое для потоков и процессов) - очень простой способ синхронизации и управления процессом. см. здесь: https://docs.python.org/3.5/library/threading.html#event-objects – RaJa

+0

Помечая событие 'True' (вызов' event.set() '), основной поток может управлять или больше рабочих потоков. Эти рабочие имеют реализованный метод event.wait() ', который блокирует поток до тех пор, пока событие не станет« истинным ». Таким образом вы можете легко синхронизировать, приостанавливать и возобновлять потоки. Он доступен в потоках и процессах. Вот несколько примеров: https://pymotw.com/2/multiprocessing/communication.html#signaling-between-processes – RaJa

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