简体   繁体   中英

How to pause a thread until data received in Python

I do not have much experience with threads (and networking in general). I am creating a script which receives data from a client ( 1 , 2 or 3 ). All these have a meaning:

1   =   NEW Apache Benchmark ITERATION - we must run new top command and append every second
2   =   END Apache Benchmark ITERATION - we must end top command
3   =   STOP ENTIRE PROGRAM

The top command on Linux just records the CPU and memory usage.

I have created an initial thread which listens for data from the client and targets the get_data() function.

The run() function waits for data to be returned from get_data() but if it isn't getting any data then both the run() and get_data() function will halt.

Is there a way to pause the thread targeting the get_data function until data is sent from the client side so that the run() function doesn't halt?

My Current Code:

import socket
import sys
import threading
import subprocess
import sched
import time
import os
import signal

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server_socket = ('xxx.xxx.x.xx', 5000)
sock.bind(server_socket)


process = None

def run_command(i):
    global process
    print("Running top")
    process = subprocess.Popen('top -b -n 1 | head -n 5 >> htop-' + str(i)  + '.txt', shell=True)
    print("Finished running top")

    return process

def get_data():
    while True:
        # data = ''
        data, address = sock.recvfrom(1024)
        print("waiting?")

        data = data.split(",")
        iteration = data[1]
        data = data[0]

        print("Data: " + data + " and iteration: " + iteration)

        time.sleep(1.0)

        # run(data, iteration)
        return data, iteration

'''
    1   =   NEW AB ITERATION - we must run new top command and append every second
    2   =   END OF AB - we must end top command
    3   =   STOP ENTIRE PROGRAM
'''

def run():
    while True:
        print("New")
        data = get_data()
        # data = data.split(",")
        iteration = data[1]
        data = data[0]

        print("Data: " + data + " and iteration: " + iteration)

        if data == '1' or data == '':
            run_command(iteration)
            print("We ran the command")

            time.sleep(1.0)

            print("Terminating")
            process.kill()
            print("We terminated the process")

        if data == '2':
            print("We got 2")
            process.kill()

        if data == '3':
            print("Closing program")
            exit()


runThread = threading.Thread(target = run)
runThread.start()


run()

print("Starting the listening thread...")

您需要使套接字无阻塞(请参阅setblocking() ),并重写run()过程以处理尚未收到套接字中的数据的情况。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM