Задать вопрос
@KPEBETKA

Каким образом можно распараллелить DBusGMainLoop?

Необходимо сканить любые съёмные носители ClamAV'ом. И вроде бы всё написал, но сканирования идут последовательньно, что тормозит процесс. Никак не могу понять как правильно можно распараллелить.
На данный момент скрипт выглядит так:
#!/usr/bin/env python

import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop
from threading import Thread
import subprocess
import os

DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()

def extract_string(data):
	s = None
	if len(data):
		s = ''
		for d in data:
			s += d
	return s

def device_added_callback(device):
	device_obj = bus.get_object("org.freedesktop.UDisks", device)
	device_props = dbus.Interface(device_obj, dbus.PROPERTIES_IFACE)
	proplist =[]
	proplist.append(device_props.GetAll('org.freedesktop.UDisks.Device'))
	
	for device_props in proplist:
		if device_props['DeviceIsMounted']:
			d =  'Device ' + device_props['DriveVendor'] + ' ' +device_props['DriveModel'] + ' "'  + device_props['IdLabel'] + '" ' + str(round(float(device_props['PartitionSize'])/(1024*1024*1024), 2)) + 'GB was added'
			s = str(extract_string(device_props['DeviceMountPaths']))
			print d + '\n' + s
			
			ps = Thread(target=clam_scan(s), args=())
			ps.daemon = True
			ps.start()

def clam_scan(s):
	print "start scan"
	proc = subprocess.Popen(['clamscan -ir "' + str(s) +'"'], stdout=subprocess.PIPE, shell=True)
	(out, err) = proc.communicate()
	print "finish scan"

	for i in out.split('\n'):
		for j in ['Scanned directories:', 'Scanned files:', 'Infected files:', 'Data scanned:', 'Data read:', 'Time:']:
			if i.find(j) > -1:
				print i

def main():
	mainloop = gobject.MainLoop()
	udisks_obj = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
	udisks = dbus.Interface(udisks_obj, 'org.freedesktop.UDisks')
	devices = udisks.get_dbus_method('EnumerateDevices')()
	udisks.connect_to_signal('DeviceChanged', device_added_callback)
	mainloop.run()

if __name__ == '__main__':

	main()
  • Вопрос задан
  • 2703 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
avalak
@avalak
После импортов gobject.threads_init() и
ps = Thread(target=clam_scan, args=[s])

А зачем
def extract_string(data):
    s = None
    if len(data):
        s = ''
        for d in data:
            s += d
    return s

когда можно просто ''.join(data)
ну и в целом код неплохо бы почистить
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы