shutdown() public méthode

Shutdown all Workers in this Pool
public shutdown ( )
 public function cancelAllTasks()
 {
     foreach ($this->tasks as $task) {
         $task->cancel();
     }
     $this->tasks = [];
     $this->asyncPool->shutdown();
     $this->asyncTasks = 0;
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $pool = new \Pool($input->getOption('threads'), \Worker::class);
     foreach ($input->getArgument('indexes') as $index) {
         $pool->submit(new IndexerRunner($input->getOption('indexer'), $input->getOption('config'), $index));
     }
     $pool->shutdown();
     $pool->collect(function (IndexerRunner $work) use($output) {
         $output->writeln($work->return);
     });
 }
Exemple #3
0
 public function __construct($threadSayisi, BurtayThread $sinif)
 {
     $pool = new Pool($threadSayisi);
     $is_listesi = array();
     for ($i = 1; $i <= $threadSayisi; $i++) {
         $is_listesi[] = new burtayThreadPool($sinif);
     }
     foreach ($is_listesi as $liste) {
         $pool->submit($liste);
     }
     $pool->shutdown();
 }
Exemple #4
0
 private function testPool()
 {
     $initTime = microtime(true);
     $pool = new \Pool(8, \Worker::class);
     for ($i = 0; $i < 10; $i++) {
         $pool->submit(new Work());
     }
     $initTime = microtime(true) - $initTime;
     $finishTime = microtime(true);
     $pool->shutdown();
     $pool->collect(function (Work $work) {
         echo 'Work of ', get_class($work), ' #', $work->i, ' - ', $work->getWork(), PHP_EOL;
     });
     $finishTime = microtime(true) - $finishTime;
     return [$initTime, $finishTime];
 }
Exemple #5
0
 public static function Init()
 {
     $config = \Rds\Configuration::get();
     $boot = \Rds\Bootstrap::getInstace($config);
     $totalPages = $boot->getTotalPages();
     if ($totalPages > 0) {
         $pool = new \Pool($config["app"]["workers"], \Rds\Worker::class, array("Vendor/autoload.php", new \Rds\StackableConfig($config)));
         for ($page = 1; $page <= $totalPages; $page++) {
             $task = new \Rds\Task($page);
             $pool->submit($task);
         }
         $pool->shutdown();
         $pool->collect(function ($work) {
             return $work->isGarbage();
         });
     }
 }
<?php

/* include autoloader normally */
require_once "vendor/autoload.php";
use Auto\Autoloader;
use Auto\Task;
/* create pool of workers of the specified class, passing the specified
   path to autoloader */
$pool = new Pool(4, Autoloader::class, ["vendor/autoload.php"]);
/* submit a task to the pool */
$pool->submit(new Task("Hello World!"));
/* in the real world, do some ::collect somewhere */
/* shutdown, because explicit is good */
$pool->shutdown();
 public function testPoolGc()
 {
     $pool = new Pool(1, PoolTestWorker::class, [new stdClass(), new Threaded()]);
     $work = new PoolTestWork();
     $pool->submit($work);
     while (@$i++ < 2) {
         $pool->submit(new PoolTestWork());
         # nothing to assert, no exceptions please
     }
     $pool->submitTo(0, new PoolTestWork());
     # nothing to assert, no exceptions please
     /* synchronize with pool */
     $sync = new PoolTestSync();
     $pool->submit($sync);
     $sync->synchronized(function ($sync) {
         if (!$sync->finished) {
             $sync->wait();
         }
     }, $sync);
     $pool->collect(function ($task) {
         $this->assertTrue($task->isGarbage());
         return true;
     });
     $pool->shutdown();
 }
Exemple #8
0
     file_put_contents(IAPROGRESS . WIKIPEDIA . UNIQUEID . "stats", serialize(array('linksAnalyzed' => $linksAnalyzed, 'linksArchived' => $linksArchived, 'linksFixed' => $linksFixed, 'linksTagged' => $linksTagged, 'pagesModified' => $pagesModified, 'pagesAnalyzed' => $pagesAnalyzed, 'runstart' => $runstart)));
 }
 if (file_exists(IAPROGRESS . WIKIPEDIA . UNIQUEID . "workers/")) {
     closedir($handle);
 }
 $workerQueue = new Pool($workerLimit);
 foreach ($pages as $tid => $tpage) {
     $pagesAnalyzed++;
     $runpagecount++;
     echo "Submitted {$tpage['title']}, job " . ($tid + 1) . " for analyzing...\n";
     $workerQueue->submit(new ThreadedBot($tpage['title'], $tpage['pageid'], $ARCHIVE_ALIVE, $TAG_OVERRIDE, $ARCHIVE_BY_ACCESSDATE, $TOUCH_ARCHIVE, $DEAD_ONLY, $NOTIFY_ERROR_ON_TALK, $NOTIFY_ON_TALK, $TALK_MESSAGE_HEADER, $TALK_MESSAGE, $TALK_ERROR_MESSAGE_HEADER, $TALK_ERROR_MESSAGE, $DEADLINK_TAGS, $CITATION_TAGS, $IGNORE_TAGS, $WAYBACK_TAGS, $WEBCITE_TAGS, $MEMENTO_TAGS, $ARCHIVEIS_TAGS, $ARCHIVE_TAGS, $IC_TAGS, $PAYWALL_TAGS, $VERIFY_DEAD, $LINK_SCAN, $NOTIFY_ON_TALK_ONLY, $MLADDARCHIVE, $MLMODIFYARCHIVE, $MLTAGGED, $MLTAGREMOVED, $MLFIX, $MLDEFAULT, $PLERROR, $MAINEDITSUMMARY, $ERRORTALKEDITSUMMARY, $TALKEDITSUMMARY, $tid));
     if (LIMITEDRUN === true && is_int($debugStyle) && $debugStyle === $runpagecount) {
         break;
     }
 }
 $workerQueue->shutdown();
 $workerQueue->collect(function ($thread) {
     global $pagesModified, $linksAnalyzed, $linksArchived, $linksFixed, $linksTagged;
     $stats = $thread->result;
     if ($stats['pagemodified'] === true) {
         $pagesModified++;
     }
     $linksAnalyzed += $stats['linksanalyzed'];
     $linksArchived += $stats['linksarchived'];
     $linksFixed += $stats['linksrescued'];
     $linksTagged += $stats['linkstagged'];
     $stats = null;
     unset($stats);
     return $thread->isGarbage();
 });
 if (file_exists(IAPROGRESS . WIKIPEDIA . UNIQUEID . "workers/") && ($handle = opendir(IAPROGRESS . WIKIPEDIA . UNIQUEID . "workers"))) {
Exemple #9
0
 /**
  *
  */
 public function run()
 {
     // Reap the threads!
     $this->websocket->loop->addPeriodicTimer(600, function () {
         $this->log->addInfo('Restarting the threading pool, to clear out old threads..');
         // Shutdown the pool
         $this->pool->shutdown();
         $this->timers->shutdown();
         // Startup the pool again
         $this->pool = new \Pool(count($this->onMessage), \Worker::class);
         $this->timers = new \Pool(count($this->onTimer), \Worker::class);
     });
     // Handle the onReady event, and setup some timers and so forth
     $this->websocket->on('ready', function (Discord $discord) {
         $this->log->addInfo('Websocket connected..');
         // Update our presence status
         $game = new Game(array('name' => $this->globalConfig->get('presence', 'bot', "table flippin'"), 'url' => null, 'type' => null), true);
         $this->websocket->updatePresence($game, false);
         // Count the amount of people we are available to..
         /** @var Guild $guild */
         foreach ($this->discord->getClient()->getGuildsAttribute()->all() as $guild) {
             $this->extras['memberCount'] += $guild->member_count;
             $this->extras['guildCount']++;
             $this->extras['guild']['memberCount']["id{$guild->id}"] = $guild->member_count;
             $this->extras['onMessagePlugins'] = $this->onMessage;
             $this->extras['onVoicePlugins'] = $this->onVoice;
         }
         $this->log->addInfo("Member count, currently available to: {$this->extras['memberCount']} people");
         // Setup the timers for the timer plugins
         foreach ($this->onTimer as $command => $data) {
             $this->websocket->loop->addPeriodicTimer($data['timer'], function () use($data, $discord) {
                 try {
                     $plugin = new $data['class']($discord, $this->log, $this->globalConfig, $this->db, $this->curl, $this->settings, $this->permissions, $this->container->get('serverConfig'), $this->users, $this->extras);
                     $this->timers->submit($plugin);
                 } catch (\Exception $e) {
                     $this->log->addError("Error running the periodic timer: {$e->getMessage()}");
                 }
             });
         }
         // Issue periodically recounting and other things (Needed because of pthreads not putting the entire context into children - leading to some weirdness in some plugins)
         $this->websocket->loop->addPeriodicTimer(600, function () {
             $this->extras['memberCount'] = 0;
             $this->extras['guildCount'] = 0;
             /** @var Guild $guild */
             foreach ($this->discord->getClient()->getGuildsAttribute()->all() as $guild) {
                 $this->extras['memberCount'] += $guild->member_count;
                 $this->extras['guildCount']++;
                 $this->extras['guild']['memberCount']["id{$guild->id}"] = $guild->member_count;
                 $this->extras['onMessagePlugins'] = $this->onMessage;
                 $this->extras['onVoicePlugins'] = $this->onVoice;
             }
             // Output periodic information while doing the recounting stuff
             $this->log->addInfo('Currently running audio streams: ' . count($this->audioStreams));
             $this->log->addInfo("Member recount, currently available to: {$this->extras['memberCount']} people");
         });
         // @todo run a timer to check if there are any active voice sessions - and if there are, if there are any people in those voice sessions
         // If not, stop the session and leave the channel (To save some bandwidth)
     });
     $this->websocket->on('error', function ($error, $websocket) {
         $this->log->addError('An error occurred on the websocket', [$error->getMessage()]);
         die(1);
     });
     $this->websocket->on('close', function ($opCode, $reason) {
         $this->log->addWarning('Websocket got closed', ['code' => $opCode, 'reason' => $reason]);
         die(1);
     });
     $this->websocket->on('reconnecting', function () {
         $this->log->addInfo('Websocket is reconnecting..');
     });
     $this->websocket->on('reconnected', function () {
         $this->log->addInfo('Websocket was reconnected..');
     });
     // Handle incoming message logging
     $this->websocket->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
         $this->log->addInfo("Message from {$message->author->username}", [$message->content]);
         // Don't update data for ourselves..
         if ($message->author->id !== $discord->getClient()->id) {
             $this->users->set($message->author->id, $message->author->username, 'online', null, date('Y-m-d H:i:s'), date('Y-m-d H:i:s'), $message->content);
         }
         // @todo Create text logs
     });
     // Handle plugin running
     $this->websocket->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
         $guildID = $message->getChannelAttribute()->guild_id;
         // Get server config
         $config = $this->settings->get($guildID);
         // Is the person admin?
         $userDiscordID = $message->author->id;
         foreach ($this->globalConfig->get('admins', 'permissions') as $admins) {
             $message->isAdmin = $admins === $userDiscordID;
         }
         // Define the prefix if it isn't already set..
         @($config->prefix = $config->prefix ?? $this->globalConfig->get('prefix', 'bot'));
         // Check if the user requested an onMessage plugin
         if (substr($message->content, 0, strlen($config->prefix)) === $config->prefix) {
             $content = explode(' ', $message->content);
             foreach ($this->onMessage as $command => $data) {
                 $parts = [];
                 foreach ($content as $index => $c) {
                     foreach (explode("\n", $c) as $p) {
                         $parts[] = $p;
                     }
                 }
                 if ($parts[0] === $config->prefix . $command) {
                     // If they are listed under the admins array in the bot config, they're the super admins
                     if (in_array($message->author->id, $this->globalConfig->get('admins', 'permissions'))) {
                         $userPerms = 3;
                     } elseif (null !== $message->getChannelAttribute()->getGuildAttribute()->owner_id && $message->author->id === $message->getChannelAttribute()->getGuildAttribute()->owner_id) {
                         $userPerms = 2;
                     } else {
                         $userPerms = 1;
                     }
                     if ($userPerms >= $data['permissions']) {
                         try {
                             $message->getChannelAttribute()->broadcastTyping();
                             if ($data['class'] === "\\Sovereign\\Plugins\\onMessage\\auth") {
                                 /** @var \Threaded $plugin */
                                 $plugin = new $data['class']($message, $discord, $config, $this->log, $this->globalConfig, $this->db, $this->curl, $this->settings, $this->permissions, $this->container->get('serverConfig'), $this->users, $this->extras);
                                 $plugin->run();
                             } else {
                                 /** @var \Threaded $plugin */
                                 $plugin = new $data['class']($message, $discord, $config, $this->log, $this->globalConfig, $this->db, $this->curl, $this->settings, $this->permissions, $this->container->get('serverConfig'), $this->users, $this->extras);
                                 $this->pool->submit($plugin);
                             }
                             $this->log->addInfo("{$message->author->username}#{$message->author->discriminator} ({$message->author}) ran command {$config->prefix}{$command}", $content);
                         } catch (\Exception $e) {
                             $this->log->addError("Error running command {$config->prefix}{$command}. Command run by {$message->author->username} in {$message->getChannelAttribute()->name}. Error: {$e->getMessage()}");
                             $message->reply("**Error:** There was a problem running the command: {$e->getMessage()}");
                         }
                     }
                 }
             }
         }
     });
     // Handle joining a voice channel, and playing.. stuff....
     $this->websocket->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
         // Get the guildID
         $guildID = $message->getChannelAttribute()->guild_id;
         // Get this guilds settings
         $config = $this->settings->get($guildID);
         // Get the prefix for this guild
         @($config->prefix = $config->prefix ?? $this->globalConfig->get('prefix', 'bot'));
         if (substr($message->content, 0, strlen($config->prefix)) === $config->prefix) {
             $content = explode(' ', $message->content);
             foreach ($this->onVoice as $command => $data) {
                 $parts = [];
                 foreach ($content as $index => $c) {
                     foreach (explode("\n", $c) as $p) {
                         $parts[] = $p;
                     }
                 }
                 if ($parts[0] === $config->prefix . $command) {
                     try {
                         $voiceChannels = $message->getFullChannelAttribute()->getGuildAttribute()->channels->getAll('type', 'voice');
                         foreach ($voiceChannels as $channel) {
                             if (!empty($channel->members[$message->author->id])) {
                                 $voice = new $data['class']();
                                 $voice->run($message, $discord, $this->websocket, $this->log, $this->audioStreams, $channel, $this->curl);
                             }
                         }
                     } catch (\Exception $e) {
                         $this->log->addError("Error running voice command {$config->prefix}{$command}. Command run by {$message->author->username} in {$message->getChannelAttribute()->name}. Error: {$e->getMessage()}");
                         $message->reply("**Error:** There was a problem running the command: {$e->getMessage()}");
                     }
                 }
             }
         }
     });
     // Handle if it's a message for the bot (CleverBot invocation)
     $this->websocket->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
         // If we got highlighted we should probably answer back
         if (stristr($message->content, $discord->getClient()->id)) {
             try {
                 $this->pool->submit(new cleverBotMessage($message, $discord, $this->log, $this->globalConfig, $this->db, $this->curl, $this->settings, $this->permissions, $this->container->get('serverConfig'), $this->users));
             } catch (\Exception $e) {
                 $message->reply("**Error:** There was an error with CleverBot: {$e->getMessage()}");
             }
         }
     });
     // Handle presence updates
     $this->websocket->on(Event::PRESENCE_UPDATE, function (PresenceUpdate $presenceUpdate) {
         if ($presenceUpdate->user->id && $presenceUpdate->user->username) {
             try {
                 $this->log->addInfo("Updating presence info for {$presenceUpdate->user->username}");
                 $game = $presenceUpdate->getGameAttribute()->name ?? null;
                 $this->users->set($presenceUpdate->user->id, $presenceUpdate->user->username, $presenceUpdate->status, $game, date('Y-m-d H:i:s'), null, null);
             } catch (\Exception $e) {
                 $this->log->addError("Error: {$e->getMessage()}");
             }
         }
     });
     // Create a new cleverbot \nick\ for this new guild
     $this->websocket->on(Event::GUILD_CREATE, function (Guild $guild) {
         $cleverBotExists = $this->db->queryField("SELECT serverID FROM cleverbot WHERE serverID = :serverID", "serverID", array(":serverID" => $guild->id));
         $guildExists = $this->db->queryField("SELECT guildID FROM guilds WHERE guildID = :serverID", "guildID", array(":serverID" => $guild->id));
         // Only create a new server nick if the cleverbot instance doesn't exist.. (Hopefully cleverbot.io is done deleting them at random)
         if (!isset($cleverBotExists)) {
             $this->log->addInfo("Setting up Cleverbot for {$guild->name}");
             $serverID = $guild->id;
             $result = $this->curl->post('https://cleverbot.io/1.0/create', ['user' => $this->globalConfig->get('user', 'cleverbot'), 'key' => $this->globalConfig->get('key', 'cleverbot')]);
             if ($result) {
                 $result = @json_decode($result);
                 $nick = $result->nick ?? false;
                 if ($nick) {
                     $this->db->execute('INSERT INTO cleverbot (serverID, nick) VALUES (:serverID, :nick) ON DUPLICATE KEY UPDATE nick = :nick', [':serverID' => $serverID, ':nick' => $nick]);
                 }
             }
         }
         if (!isset($guildExists)) {
             $this->db->execute("INSERT IGNORE INTO guilds (guildID) VALUES (:guildID)", array(":guildID" => $guild->id));
             // Send a hello message to the channel (Only if it's new!)
             //$message = "Hello, i was invited here by someone with admin permissions, i have quite a few features that you can discover by doing %help\n";
             //$message .= "I am sorry if i am triggering other bots aswell, you can change my trigger with %config setTrigger newTrigger (Example: %config setTrigger *)\n";
             //$message .= "If you for some reason don't want me here after all, just kick me ;)";
             // Get the first channel in the list (usually the default channel)
             //$channel = $guild->channels->first();
             //$channel->sendMessage($message);
         }
     });
     // Run the websocket, and in turn, the bot!
     $this->websocket->run();
 }
 public function removeTasks()
 {
     $this->pool->shutdown();
 }