First test runs with multiprocessing.
This commit is contained in:
		
							
								
								
									
										82
									
								
								ircthing.py
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								ircthing.py
									
									
									
									
									
								
							@@ -1,54 +1,71 @@
 | 
			
		||||
import threading
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import time
 | 
			
		||||
import socket
 | 
			
		||||
from ircthing_core import irc_router, connect_to_irc_server
 | 
			
		||||
from ircthing_utils import read_config
 | 
			
		||||
from ircthing_utils import read_config, cli_args, base_path
 | 
			
		||||
import time
 | 
			
		||||
import os
 | 
			
		||||
import multiprocessing
 | 
			
		||||
 | 
			
		||||
Threads = {}
 | 
			
		||||
Stop_Toggle = threading.Event()
 | 
			
		||||
Processes = {}
 | 
			
		||||
Stop_Toggle = multiprocessing.Event()
 | 
			
		||||
 | 
			
		||||
def clean_exit(fifo_files, socket):
 | 
			
		||||
    socket.send(bytes(f"QUIT :Bye\r\n", "UTF-8"))
 | 
			
		||||
def clean_exit():
 | 
			
		||||
    Stop_Toggle.set()
 | 
			
		||||
    for file in fifo_files:
 | 
			
		||||
        try:
 | 
			
		||||
            os.unlink(file)
 | 
			
		||||
        except FileNotFoundError:
 | 
			
		||||
            # We are okay if some fifo files has been removed before this.
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    my_name = sys.argv[0]
 | 
			
		||||
    my_name_pyless, _ = os.path.splitext(my_name)
 | 
			
		||||
    base_path = f'/tmp/{my_name_pyless}'
 | 
			
		||||
    root_path = base_path()
 | 
			
		||||
 | 
			
		||||
    config_path = '../ircthing3.ini'
 | 
			
		||||
 | 
			
		||||
    # Read configurations for all topics
 | 
			
		||||
    # Get configuration file path if given
 | 
			
		||||
    config_path = 'config.ini'
 | 
			
		||||
    argument = cli_args()
 | 
			
		||||
    if argument:
 | 
			
		||||
        config_path = argument
 | 
			
		||||
    # Read configuration 
 | 
			
		||||
    network_configs = read_config(config_path)
 | 
			
		||||
 | 
			
		||||
    ## Get irc socket for each network in configuration
 | 
			
		||||
    ## Start thread for each socket 
 | 
			
		||||
    
 | 
			
		||||
    for network in network_configs:
 | 
			
		||||
        net_name = network["net_name"]
 | 
			
		||||
        print(f"{time.time()} | Found configs for {net_name} network.")
 | 
			
		||||
        server = network["server"]
 | 
			
		||||
        port = network["port"]
 | 
			
		||||
        nickname = network["nickname"]
 | 
			
		||||
        password = network["password"]
 | 
			
		||||
        irc_socket, fifo_files = connect_to_irc_server(base_path, net_name, server, port, nickname, password)
 | 
			
		||||
 | 
			
		||||
        router_instance = irc_router(fifo_files, irc_socket, server, nickname)
 | 
			
		||||
        Threads[net_name] = threading.Thread(target=router_instance.start)
 | 
			
		||||
        Threads[net_name].daemon = True
 | 
			
		||||
        Threads[net_name].start()
 | 
			
		||||
        print(f"{time.time()} | Found configs for {net_name} network.")
 | 
			
		||||
        irc_socket, fifo_files, network_dir = connect_to_irc_server(root_path, net_name, server, port, nickname, password)
 | 
			
		||||
 | 
			
		||||
    for thread in Threads.values():
 | 
			
		||||
        print(thread)
 | 
			
		||||
        thread.join()
 | 
			
		||||
        router_instance = irc_router(fifo_files, irc_socket, server, nickname, network_dir)
 | 
			
		||||
        Processes[net_name] = multiprocessing.Process(target=router_instance.start)
 | 
			
		||||
        Processes[net_name].daemon = True
 | 
			
		||||
        Processes[net_name].start()
 | 
			
		||||
 | 
			
		||||
    main_handle(root_path)
 | 
			
		||||
 | 
			
		||||
    for process in Processes.values():
 | 
			
		||||
        process.join()
 | 
			
		||||
 | 
			
		||||
def main_handle(path):
 | 
			
		||||
    input = f"{path}/in"
 | 
			
		||||
    output = f"{path}/out"
 | 
			
		||||
    os.mkfifo(input)
 | 
			
		||||
    os.mkfifo(output)
 | 
			
		||||
    while True:
 | 
			
		||||
        line = read_input(input)
 | 
			
		||||
        write_output(output, line)
 | 
			
		||||
 | 
			
		||||
def read_input(file):
 | 
			
		||||
    with open(file, 'r') as input:
 | 
			
		||||
        line = input.readline().strip()
 | 
			
		||||
        if not line:
 | 
			
		||||
            return
 | 
			
		||||
        if line == "exit":
 | 
			
		||||
            clean_exit()
 | 
			
		||||
        return line
 | 
			
		||||
 | 
			
		||||
def write_output(file, line):
 | 
			
		||||
    with open(file, 'a') as output:
 | 
			
		||||
        output.write(f"{time.time()} | {line}\r\n")
 | 
			
		||||
        output.flush()
 | 
			
		||||
        output.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
@@ -58,5 +75,6 @@ if __name__ == "__main__":
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        print(f"Got error {e}")
 | 
			
		||||
    finally:
 | 
			
		||||
        clean_exit()
 | 
			
		||||
        print(f"{time.time()} | Bye!")
 | 
			
		||||
        exit(0)
 | 
			
		||||
 
 | 
			
		||||
@@ -29,17 +29,18 @@ def connect_to_irc_server(
 | 
			
		||||
    irc_socket.send(bytes(f"NICK {nickname}\r\n", "UTF-8"))
 | 
			
		||||
 | 
			
		||||
    # Create directories for the server and channel
 | 
			
		||||
    fifo_files = make_files(base_path, net_name)
 | 
			
		||||
    fifo_files, network_path = make_files(base_path, net_name)
 | 
			
		||||
 | 
			
		||||
    return irc_socket, fifo_files
 | 
			
		||||
    return irc_socket, fifo_files, network_path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class irc_router:
 | 
			
		||||
    def __init__(self, fifo_files, irc_socket, server, nickname):
 | 
			
		||||
    def __init__(self, fifo_files, irc_socket, server, nickname, network_dir):
 | 
			
		||||
        self.fifo_files = fifo_files
 | 
			
		||||
        self.irc_socket = irc_socket
 | 
			
		||||
        self.server = server
 | 
			
		||||
        self.nickname = nickname
 | 
			
		||||
        self.network_dir = network_dir
 | 
			
		||||
        self.channels = []
 | 
			
		||||
        self._loop = asyncio.new_event_loop()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,21 @@
 | 
			
		||||
import configparser
 | 
			
		||||
import argparse
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
def base_path():
 | 
			
		||||
    my_name = sys.argv[0]
 | 
			
		||||
    my_name_pyless, _ = os.path.splitext(my_name)
 | 
			
		||||
    return f'/tmp/{my_name_pyless}'
 | 
			
		||||
 | 
			
		||||
def cli_args():
 | 
			
		||||
    parser = argparse.ArgumentParser(description="Usage: python3.11 ircthing.py /myconfig.ini")
 | 
			
		||||
    parser.add_argument('config', help="Path to the configuration file.")
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
    if args.config:
 | 
			
		||||
        return args.config
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
def read_config(config_path):
 | 
			
		||||
    config = configparser.ConfigParser()
 | 
			
		||||
@@ -47,5 +63,5 @@ def make_files(path, net_name):
 | 
			
		||||
    fifo_files = []
 | 
			
		||||
    fifo_files.append(f"{server_dir}/in")
 | 
			
		||||
    fifo_files.append(f"{server_dir}/out")
 | 
			
		||||
    return fifo_files
 | 
			
		||||
    return fifo_files, server_dir
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user