2013-11-22 6 views
1

Я делаю IRC-бот в Python. Существует цикл while, который повторяется каждый раз, когда данные поступают с IRC-сервера. Я хочу иметь еще одну петлю while, которая запускается каждую минуту, поэтому я не могу представить, как объединить петли.Два цикла в одном?

Есть ли способ «фона» одного из циклов и позволить остальной программе продолжать работать, пока она «делает свою вещь»?

+0

Похоже, вы хотите использовать очереди сообщений? –

+0

Вы можете захотеть «python threading» google здесь. –

+0

Речь идет о 'threads'. – jramirez

ответ

4

Этого простой пример должен, чтобы вы начали, в этом случае есть два в то время как петля и time.sleep(seconds) используются для имитации некоторой работы

import threading 
import time 

def func_1(): 
    i = 0 
    while i<5: 
     i += 1 
     time.sleep(1.5) # Do some work for 1.5 seconds 
     print 'func_1' 

def func_2(): 
    i = 0 
    while i<5: 
     i += 1 
     time.sleep(0.5) # Do some work for 0.5 seconds 
     print 'func_2' 

thread1 = threading.Thread(target=func_1) 
thread1.start() 
thread2 = threading.Thread(target=func_2) 
thread2.start() 

производит:

func_2 #0.5 seconds elapsed 
func_2 #1.0 seconds elapsed 
func_1 #1.5 seconds elapsed finally func_1 :) 
func_2 #1.5 threading is not mutithreading! ;) 
func_2 #2.0 seconds elapsed 
func_2 #2.5 seconds elapsed and since variable i is 5 func_2 is no more :(
func_1 #3.0 seconds elapsed 
func_1 #4.5 seconds elapsed 
func_1 #6.0 seconds elapsed 
func_1 #7.5 seconds elapsed 

Edit:

То, что я имел в виду, говоря threading is not mutithreading! ;), состоит в том, что если вы случайно считаете, что и func_1, и func_2 выполнены con в настоящее время 1.5 seconds не Правда, как потоки выполняются в том же пространстве памяти, но если вы используете multiprocessing они имеют отдельные пространства памяти и будет работать одновременно

Наконец, В вашем случае вы должны использовать threading как его более подходящим для них тип задач

+0

, что вы имеете в виду с потоками, не mutithreading? – Ant

+0

@ Хороший вопрос, я сделал этот комментарий в первую очередь для OP * (это не влияет на этот пример) *, это просто означает, что оба 'func_1' и' func_2' не будут запускаться одновременно –

+0

Итак, с поточной передачей «почти одновременно», например «print (x); print (y)» и многопоточность, которые они фактически запускают одновременно? Несмотря на это, нарезка прекрасно работает для моих нужд. –

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