2015-10-08 2 views
0

Существует функция, которая должна спать 10 секунд. Но в то же время я не хочу, чтобы он блокировал мою основную функцию. Как с этим бороться? Я пытаюсь сделать так. Однако он все еще блокирует мою основную функцию.Как сделать async в python?

def tester(): 
    pool.size=2; 
    pool=multiprocessing.Pool(pool_size); 
    pool.apply_async(send_mail, args=("test",)); 
    pool.close(); 
    pool.join(); 
    print "email is done"; 

Основная функция вызовет эту функцию.

ответ

1

pool.join();

- ваш блокиратор. удалите его, чтобы он не блокировался.

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.join

EDIT:

import threading 

print "start" 
th = threading.Thread(target=tester) 
th.daemon = False 
print "thread start" 
th.start() 
print "executing other code" 
+0

Но функция тест не работает больше –

+0

К сожалению, это работает. Причина, по которой он не появляется, кажется, что главная функция заканчивается до завершения подпроцесса. –

+0

открутите свои письма в отдельную тему. пометив его как не-daemon, программа python не выйдет, пока не будет завершена. Я добавил пример кода выше – James

0

Не уверен, почему вы используете бассейн. Вы создаете 2 подпроцесса для отправки одного электронного письма? Как насчет того, чтобы просто создать единственный процесс. Следующее должно начать вас. (Я поставил «сон (30)», где вы на самом деле назвать send_mail)

from multiprocessing import Process, Queue 
from time import sleep 

def wrap_send_email(q, msg): 
    try: 
     sleep(30) 
     q.put([ msg, 'mail sent sucessfully']) 
    except: 
     q.put([ msg, 'mail not sent successfully']) 


def test(): 
    q = Queue() 
    p = Process(target=wrap_send_email, args=(q, 'test message')) 
    p.start() 
    while p.is_alive(): 
     print("Doing stuff while the other process is working.") 
     sleep(5) 
    print(q.get()) 
    p.join() 
+0

. Причина блокировки - join(). –

+0

Да. Возможно, я не понимал, чего вы пытаетесь достичь. У вас есть заявление, «печать» электронной почты выполняется «после соединения». Если вы удалите соединение, этот оператор будет выполняться немедленно и не обязательно после того, как письмо будет выполнено. Я также не знаю, для чего вам нужен пул из 2 для этого приложения. Пул из 1 кажется достаточным, и в этом случае зачем использовать «пул» вообще, просто используйте «Процесс». – RobertB

+0

Вы правы. Я должен установить пул как 1. Что делать, если в пуле есть функция? Мне интересно. Пойдет ли он во 2-й пул, если я установлю пул на 2? –

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