Форум сайта python.su
0
Доброго дня, делаю первые шаги в питоне пишу сервис внутри которого должно независимо крутиться несколько потоков. Написал часть кода и столкнулся с определённым непониманием…
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'
Офлайн
14
hexesДа тут вообще ни какие процессы не создаются, тут создаются потоки.
я краем мозга понимаю что процессы тут “не настоящие” и пока не закончит выполняться t1 t2 не запустится.
hexesПотоки выполняются как бы параллельно, то сначала один по выполняется, потом другой и так идёт переключение между выполнением потоков. В общем почитай про параллельное программирование и про потоки, ты основ не знаешь.
и пока не закончит выполняться t1 t2 не запустится.
Офлайн
0
Да, не спорю.
Значит не правильно понимаю. Почему тогда 7 и 8 не появляются в логах?
Спасибо за видео! Ушёл смотреть!
Офлайн
14
Потому что ты не понимаешь, что делает метод join. Join заставляет поток который его вызвал ждать пока закончиться выполнения, чей метод был вызван.
То есть у тебя получается, что главный поток программы вызывает join потока t1 и главный поток будет ждать пока не закончится выполняться поток t1. По этому на консоль не выводятся твои принты.
Офлайн
0
С чем может быть с питоном?
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)
непонять как работает….
Офлайн
14
hexes
Ты вообще о чем? Я не экстрасенс, твои мысли читать не умею. Где код? Где ошибки? Что не работает?
Офлайн
53
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)непонять как работает….
Офлайн
0
alex925, ну по выполнению видно что работа не корректно, где то выводится часть запроса, где то ничего, где то в сегфаулт выпадает…
sander, спасибо за направление… Сейчас покопаю в эту сторону… (а сокеты при закрытии скрипта не должны закрываться?)
Офлайн
0
#!/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()
Офлайн
0
Доброго дня, подскажите, взял демонизатор: 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()
Отредактировано hexes (Окт. 1, 2015 15:00:50)
Офлайн