리턴 - python thread 멈추기



쓰레드 스위치의 파이썬 분할 오류 (1)

타이머 자체에서 타이머를 초기화하고 있습니다. 너무 좋지 않을 수 있습니다 (스레드와 재귀 호출, 아). 핑 지연 (Ping Delay)의 정확성에 대해 지나치게 요구하지 않는다면 Timer 가 필요하지 않습니다. 주기적으로 다음과 같이 루프를 반복하여 핑을 실행할 수 있습니다.

import threading,subprocess,time

def check_internet():
    while True:
        time.sleep(1)
        response = subprocess.call("ping -n 1 google.com".split())
        print(response)
        if response == 0:
            print("CONNECTIVITY: \tConnected to internet")
        else:
            print("CONNECTIVITY: \tUnable to connect to internet")

t=threading.Thread(target=check_internet)
t.start()

print("Started")
t.join()

당신은 오직 1 초마다 1 핑 프로세스를 생성하는 1 스레드 만 생성합니다 (조절 타이머는 아니지만 충분해야합니다).

수정 : ping 출력하지 않고 버전 :

import threading,subprocess,time

def check_internet():
    while True:
        time.sleep(1)
        p = subprocess.Popen("ping -n 1 google.com".split(),stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
        out,err = p.communicate()
        response = p.wait()
        if response == 0:
            print("CONNECTIVITY: \tConnected to internet")
        else:
            print("CONNECTIVITY: \tUnable to connect to internet")

t=threading.Thread(target=check_internet)
t.start()

print("Started")
t.join()

https://ffff65535.com

컴퓨터에서 google.com을 핑 (ping) 할 수 있는지 확인해야하는 응용 프로그램을 개발 중입니다. 이렇게하려면 파이썬 하위 프로세스 모듈을 사용하고 아래 코드와 같이 호출합니다.

response = subprocess.call("ping -c 1 google.com -q", shell=True) 

그러나 얼마 동안 실행 한 후에는 프로그램이 세그멘테이션 오류와 함께 종료됩니다.

다음 코드가 있습니다.

daemon.py

def dataset_save(smartphone, mote):
print("DATA LOGGER:\tStarting Now")
with open('dataset.csv', 'a+') as dataset:
    dataset.write(str(datetime.datetime.today()) + ',' + \
            str(datetime.datetime.today().weekday()) + ',' + \
            str(smartphone.connected) + ',' + \
            str(mote.A0_pw) + ',' + \
            str(mote.B00_pw) + ',' + \
            str(mote.B01_pw) + ',' + \
            str(mote.B10_pw) + ',' + \
            str(mote.B11_pw) + ',' + \
            str(presence.get_value()) + ',' + \
            str(temperature.get_value()) + ',' + \
            str(luminosity.get_value()) + '\n')
    print("DATA LOGGER: \tData successfully logged @ %s!" %str(datetime.datetime.today()))
return


def run():
    check_internet()
    while True:
        dataset_save(smartphone, gateway)
        check_presence()

check_internet.py

def check_internet():
response = subprocess.call("ping -c 1 google.com -q", shell=True)
print(response)
if response == 0:
    print ("CONNECTIVITY: \tConnected to internet")
    threading.Timer(1, check_internet).start()
    return

else: 
    print("CONNECTIVITY: \tUnable to connect to internet")
    threading.Timer(1, check_internet).start()
    return

GDB에서 이것을 실행하면 세그멘테이션 오류시 다음과 같은 결과를 얻을 수 있습니다.

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 146.626/146.626/146.626/0.000 ms
0
CONNECTIVITY:   Connected to internet
[New Thread 0xb55ffb40 (LWP 4064)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb65ffb40 (LWP 4043)]
PING google.com (216.58.222.110) 56(84) bytes of data.
__deallocate_stack (pd=0xb65ffb40) at allocatestack.c:760
760 allocatestack.c: No such file or directory.
(gdb) 
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 146.504/146.504/146.504/0.000 ms

(gdb) bt
#0  __deallocate_stack (pd=0xb65ffb40) at allocatestack.c:760
#1  0xb7fc3eab in start_thread (arg=0xb65ffb40) at pthread_create.c:427
#2  0xb7e8164e in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:129
(gdb) 

쓰레기를 사용해서는 안되는 이유가 있나? 내가 쓰고있는 것처럼? 스레드의 연속 생성이이 세분화 오류의 원인입니다.

감사.





segmentation-fault