Найти - Пользователи
Полная версия: помогите с потоками/архитектурой сервиса
Начало » Python для новичков » помогите с потоками/архитектурой сервиса
1 2
hexes
Доброго дня, делаю первые шаги в питоне пишу сервис внутри которого должно независимо крутиться несколько потоков. Написал часть кода и столкнулся с определённым непониманием…
def rab_s():
    rp_channel.basic_qos(prefetch_count=1)
    rp_channel.basic_consume(rp_callback, queue='reg')
    mc_channel.basic_consume(mc_callback, queue='mkcert')
    mc_channel.start_consuming()
def udp_server():
    UDP_IP = "127.0.0.1"
    UDP_PORT = 19232
    sock = socket.socket(socket.AF_INET, # Internet
                          socket.SOCK_DGRAM) # UDP
    sock.bind(('', UDP_PORT))
    
    while True:
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        print str(addr)+"received message:", data
        sock.sendto('192.168.1.100:8080', addr)
print '4'
t1 = threading.Thread(target=udp_server,)
t2 = threading.Thread(target=rab_server,)
t1.daemon = True
t1.setDaemon(True)
t2.daemon = True
t2.setDaemon(True)
print '5'
t1.start()
t2.start()
print '6'
t1.join()
print '7'
t2.join()
print '8'
опытные товарищи думаю догадаются что на цифре 6 лог оборвался, дальше работа не идёт…
я краем мозга понимаю что процессы тут “не настоящие” и пока не закончит выполняться t1 t2 не запустится.
ОК, а как быть то? какой выход? чтобы они крутились совершенно независимо? И в идеале в процессе работы могли слать дрдр чего нить…
alex925
hexes
я краем мозга понимаю что процессы тут “не настоящие” и пока не закончит выполняться t1 t2 не запустится.
Да тут вообще ни какие процессы не создаются, тут создаются потоки.
hexes
и пока не закончит выполняться t1 t2 не запустится.
Потоки выполняются как бы параллельно, то сначала один по выполняется, потом другой и так идёт переключение между выполнением потоков. В общем почитай про параллельное программирование и про потоки, ты основ не знаешь.

Советую полностью посмотреть вот это http://www.youtube.com/watch?v=AWX4JnAnjBE
hexes
Да, не спорю.
Значит не правильно понимаю. Почему тогда 7 и 8 не появляются в логах?
Спасибо за видео! Ушёл смотреть!
alex925
Потому что ты не понимаешь, что делает метод join. Join заставляет поток который его вызвал ждать пока закончиться выполнения, чей метод был вызван.
То есть у тебя получается, что главный поток программы вызывает join потока t1 и главный поток будет ждать пока не закончится выполняться поток t1. По этому на консоль не выводятся твои принты.
hexes
С чем может быть с питоном?
Mar 6 14:44:31 hexes-pc kernel: python: segfault at 58 ip 000000000056d7c6 sp 00007feeed3c43f0 error 4 in python2.7
Работало всё работало… и приехали..
./as1.py
333
444
555
hexes@hexes-pc:~/python/as$ ./as1.py
333
444
[555
('IdPayment', 16
hexes@hexes-pc:~/python/as$ ./as1.py
333
444
[555
('IdPayment', 16, 0, 35, 9, 0, 0), ('IdPaymentMethod', 7, 0, 2, 0, 0, 0), ('IdSession', 16, 0, 35, 9, 0, 0), ('Mark', 0, 0, 4, 0, 0, 0), ('Amount', 14, 0, 8, 0, 0, 0), ('IdOrder', 16, 0, 35, 9, 0, 32), ('BeginTime', 12, 0, 8, 0, 0, 0), ('IsCompleted', 11, 0, 1, 0, 0, 0), ('PayDocNum', 0, 0, 36, 0, 0, 32), ('Attributes', 0, 0, 254, 0, 0, 32), ('Account', 6, 0, 1, 0, 0, 32), ('IdClient', 16, 0, 35, 6, 0, 32), ('IdInvoice', 16, 0, 35, 9, 0, 32), ('IdExtSession', 16, 0, 35, 9, 0, 32), ('IdLeaseOrder', 16, 0, 35, 9, 0, 32), ('ReduceBalance', 6, 0, 1, 0, 0, 32), ('rrn', 0, 0, 36, 0, 0, 32)]Segmentation fault (core dumped)

непонять как работает….
alex925
hexes
Ты вообще о чем? Я не экстрасенс, твои мысли читать не умею. Где код? Где ошибки? Что не работает?
sander
hexes
С чем может быть с питоном?Mar 6 14:44:31 hexes-pc kernel: python: segfault at 58 ip 000000000056d7c6 sp 00007feeed3c43f0 error 4 in python2.7Работало всё работало… и приехали…/as1.py 333444555hexes@hexes-pc:~/python/as$ ./as1.py 333444[555('IdPayment', 16hexes@hexes-pc:~/python/as$ ./as1.py 333444Segmentation fault (core dumped)непонять как работает….
слишком много открытых сокетов
hexes
alex925, ну по выполнению видно что работа не корректно, где то выводится часть запроса, где то ничего, где то в сегфаулт выпадает…
sander, спасибо за направление… Сейчас покопаю в эту сторону… (а сокеты при закрытии скрипта не должны закрываться?)
hexes
#!/usr/bin/env python
import logging
import logging.handlers
import argparse
import sys
import time  # this is only being used as part of the example
import pika
import threading
import string, locale, Sybase
# Loop forever, doing something useful hopefully:
def getRefunds():
        global num_threads, thread_started
        db = Sybase.connect('srv', 'login', 'pass', database='db', locale = 'cp1251', auto_commit = 1, delay_connect = 1)
        db.set_property(Sybase.CS_HOSTNAME, 'm')
        db.connect()
        c = db.cursor()
        while True:
                c.execute("select * from payment where begintime>='03/03/2015' and begintime <= '03/04/2015' and idpaymentmethod=4")
                # Get a cursor description which contains column names
                desc = c.description
                print desc
                rowset = c.fetchall()
                print rowset
                for row in rowset:
                        print 'rrn'+str(row[16])
                #time.sleep(60)
        c.close()
        db.close()
thread_refund = threading.Thread(target=getRefunds, )
thread_refund.daemon = True
thread_refund.setDaemon(True)
thread_refund.start()

PS lsof -i | wc -l говорит 145 - вроде не так и много…
hexes
Доброго дня, подскажите, взял демонизатор: https://github.com/serverdensity/python-daemon
сделал так:
class Basis(Daemon):
    def getSchedule(self, nWeek):
        while True:
            print "list of sch",nWeek
            time.sleep(10)
    def getSP(self):
        while True:
            print "list of sp"
            time.sleep(10)
    def run(self):
        tr1=threading.Thread(target=self.getSchedule(1),)
        tr1.setDaemon(True)
        tr1.start()
        tr2=threading.Thread(target=self.getSP(),)
        tr2.setDaemon(True)
        tr2.start()
В консоли получаю:
list of sch 1
list of sch 1
list of sch 1
list of sch 1

те 2ой тред не запускается… почему? что не так?

Может я вообще не правильно архитектуру придумал? Мне нужно чтобы скрипт запускался как демон, и внутри у него крутились потоки…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB