Pthreads与PHP无限循环的平行
我正在寻找一种在PHP上执行多线程的方法,并遇到了PTHreads PHP API,我认为这很容易实现(但是,我必须找出如何使用ZTS支持安装PHP版本对于Debian). 事实是,当我查看pthreads php.net文档时,我发现了这一点: 提示考虑使用并行. 我不知道的. 我的目标是获取一个项目列表,为每个项目列出,打开一个永远倾听某些更新的Websocket.因此,该线程应该永远存在,如果杀死或停止,或者应该重新启动(但是我认为我可以在外部处理这个). 我不确定哪一个最适合这种情况.有任何建议吗? 解决方案 首先要说的是,在您的应用程序的描述中没有任何线程使用线程的描述,似乎您真正想要的是异步的并发:异步并发性通常用于增加的吞吐量I/O绑定的代码,消除不必要的等待.并行并发通常用于通过使用更多内核来增加CPU绑定代码的吞吐量. 在PHP中实现非阻滞I/O的一些好框架,我建议的是 amphp . 当然,我可能没有对您的应用程序的完
2 2023-05-30
编程技术问答社区
在php中并行mysql查询?
我将数据碎片片到多个MySQL数据库中,但有时我需要从多个碎片中收集信息.如何在PHP中并行查询多个MySQL数据库? 我已经看到了一些异步卷曲请求和shell_exec的示例,但是有一种更直接的方法吗? 解决方案 新的MySQLND驱动程序可以执行异步查询.文档很少,但是在演示文稿中有一些示例(也与碎片有关)
0 2023-05-30
编程技术问答社区
在PHP中平行地执行函数
PHP可以调用函数,不要等待它返回吗?这样的事情: function callback($pause, $arg) { sleep($pause); echo $arg, "\n"; } header('Content-Type: text/plain'); fast_call_user_func_array('callback', array(3, 'three')); fast_call_user_func_array('callback', array(2, 'two')); fast_call_user_func_array('callback', array(1, 'one')); 将输出 one (after 1 second) two (after 2 seconds) three (after 3 seconds) 而不是 three (after 3 seconds) two (after 3 + 2 = 5 seconds) o
2 2023-05-28
编程技术问答社区
并行执行多个PHP脚本,并在完成后得到通知
所以,这就是我要做的 - 实际上是不言自明的: 启动x'同时'进程(每个过程都绑定到其他PHP脚本) 能够说 所有这些都完成 我已经看过各种不同的方法,我可能会使用exec和背景过程. (沿这些行). 东西 - 我真的无法抓住我的头 - 是: 我不知道这是检查所有过程是否完成的最有效方法 (能够关注一般进度 - 例如x y完成,也是必须的). 重要的是时间效率,并且 - 显然 - 不会导致任何不必要的服务器超载(因此,我想任何"冷冻" while循环检查live pid s,即使在间隔不在问题,对吗?) 任何建议都非常欢迎! p.s.:我最初从客户端开始使用异步的AJAX请求来设置整个内容,但我目前正在考虑迁移到非Javascript服务器端环境.并行处理的问题仍然存在... 解决方案 您应该研究PCNTL_FORK和相关功能.这允许一个主过程形成许多儿童过程,并被通知儿童退出状态. fork.php
0 2023-05-27
编程技术问答社区
阿帕奇+PHP多个脚本同时使用
美好的一天. 首先,对不起我的英语不好=) 所以.我创建了脚本: 我的apache有MPM模块,我显然没有在此脚本中使用会话,只是睡觉(10). 当我同时在浏览器中打开2个选项卡时,第一个选项卡将在10秒内加载,第二个选项卡-20秒. 但是.当我同时在2个不同的浏览器中打开此脚本时,它将在10秒后加载每个脚本. 所以,我开始思考,我的问题是"连接:保持现象".我更改了脚本: phpinfo() - 可以肯定的是,标题是在睡觉前发送的(). Buuuut ...我遇到了同样的问题.在Chrome的第一个选项卡中,我获得了带有"连接:关闭"的标题,在第二个选项卡中,我无法在第一个脚本结束时获得响应标题.在两个不同的浏览器中 - 一切都是正常的. 现在,我绝对没有想法,我在做什么错.为什
0 2023-05-27
编程技术问答社区
PHP:如何启动一个分离过程?
目前我的解决方案是: exec('php file.php >/dev/null 2>&1 &'); 和in file.php if (posix_getpid() != posix_getsid(getmypid())) posix_setsid(); 有什么办法可以使用exec? 解决方案 否,无法直接使用exec()进行分离(NOR shell_exec()或system(),至少不是不更改命令,并使用第三方工具它确实分离). 如果您有function detached_exec($cmd) { $pid = pcntl_fork(); switch($pid) { // fork errror case -1 : return false; // this code runs in child process case 0 : // obtain a new process group posix_setsid(); // exec th
0 2023-05-27
编程技术问答社区
并行执行函数
我有一个函数,需要从数组中跨越约20k的行,并将外部脚本应用于每个脚本.这是一个缓慢的过程,因为PHP正在等待执行脚本,然后再继续执行下一行. 为了使这个过程更快,我正在考虑同时在不同部分运行该功能.因此,例如,第0至2000行作为一个函数,2001年至4000,依此类推.我该如何以整洁的方式做到这一点?我可以从事不同的cron作业,每个功能都具有不同的参数:myFunction(0, 2000),然后用myFunction(2001, 4000)等的另一个cron作业等.但这似乎并不太干净.做这件事的好方法是什么? 解决方案 如果您想在PHP中执行并行任务,我将考虑使用 Gearman .另一种方法是使用 pcntl_fork(),但我更喜欢实际的工人在任务基于任务时. 其他解决方案 您遭受的唯一等待时间是获取数据和处理数据.实际上,处理数据实际上是完全阻止的(您只需要等待它)即可.您不可能在将流程数量增加到所拥有的核心数量之前获得任何好处.基本上,我认为这意味着
0 2023-05-27
编程技术问答社区
我如何用PHP实现这个方案?
我正在编写使用C2DM的Android应用程序.当用户向服务器发送一些消息时,服务器会回复发件人,并将该消息转发给网络中的其他用户. 问题是,对发送者的答复延迟,直到将消息转发给所有其他内容为止.这需要很多时间.我希望回复首先发送回发送者,然后执行转发过程.我该如何实现...?如果我可以使用并行处理,我该如何在PHP中进行...?任何帮助都将不胜感激:) 我使用过这样的东西, print(json_encode("Inserted Successfully"));//." ".count($tags))); while($row = mysql_fetch_row($result)) { $id = $row[0]; sendMessageToUserID($id,"New Question !!",$ques_id,"yyyy"); } 但是,在此处"成功插入"不会发送给发件人,直到执行WARE循环后. 解决方案 我不知道这是否有
0 2023-05-27
编程技术问答社区
PHP 守护程序/工作环境
问题:我想实现几个在MQ服务队列中聆听异步作业的PHP-worker流程.现在的问题在于,仅仅作为服务器上的守护程序就不会真正地控制我对实例(负载,状态,锁定)的任何级别的控制... 因此,我正在寻找某种运行时环境,使我可以在系统(过程)级别或较高层(某种Java风格的应用程序)上监视和控制实例 任何指针? 解决方案 这是一些可能有用的代码.
0 2023-05-26
编程技术问答社区
PHP中的并行处理-如何做?
我目前正在尝试在PHP中实现职位队列.然后,队列将作为批处理作业处理,并应能够并行处理一些作业. 我已经进行了一些研究,并找到了几种实施方法,但我并不真正意识到它们的优势和缺点. 例如.通过通过fsockopen多次调用脚本来进行并行处理,如下所示: php 中的易于并行处理 我发现的另一种方式是使用curl_multi函数. curl_multi_exec php docs ,但我认为这两种方法会添加大量的开销,以在主要应在后台运行的队列中创建批处理处理? 我还阅读了pcntl_fork,这似乎也是解决问题的一种方式.但是,如果您真的不知道自己在做什么(如我目前),看起来它可能会变得凌乱. . 我也看过Gearman,但是在那里我还需要根据需要动态地产生工作线程,而不仅仅是运行几个,然后让Gearman Job Server将其发送给免费的工人.特别是因为执行一项作业后应干净地退出线程,以免遇到最终的内存泄漏(代码在该问题中可能不是完美的). Ge
0 2023-05-26
编程技术问答社区
第N次置换算法,用于蛮横的垃圾箱包装并行化(包含同一项目多次)。
我已经写了一个小 open-Source 3D bin包装库使用Bruts-Force Packager用于实时计算网络订单运输成本.许多订单包含少数项目,使蛮力成为其他算法的公平补充. 由于订单可以包含相同的项目多次(即重复/重复/相同的元素),因此我使用了词法排列算法. 现在,我正在尝试添加一些瘫痪/多线程,并找到了>一些用于计算n-th词法排列的算法.但是,没有人考虑到订单可以多次包含相同的项目. 理想情况下,我将能够将排列数除以线程数,并让每个线程计算其起点并运行特定数量的迭代. 是否存在这样的算法? - 更新: 是的,它做得. Java代码从链接的答案进行了调整: public static int[] unrank(int[] frequencies, int rank) { // https://stackoverflow.com/questions/22642151/finding-the-ranking-of-a-
0 2023-05-25
编程技术问答社区
如何用OpenMP并行化一个数组移位?
我如何与OpenMP并行化数组偏移? 我尝试了几件事,但没有在以下示例中获得任何准确的结果(旋转Carteira对象的元素,对于排列算法): void rotaciona(int i) { Carteira aux = this->carteira[i]; for(int c = i; c size - 1; c++) { this->carteira[c] = this->carteira[c+1]; } this->carteira[this->size-1] = aux; } 非常感谢! 解决方案 这是 loop-carried distionencies 和因此,由于任务(循环的每次迭代)并非独立,因此不能像书面一样容易平行.打破依赖性可能从琐碎的修改到完全不可能的 (例如,迭代循环). 在这里,情况有些介于两者之间.并行执行此操作的问题是,您需要找出在邻居更改值之前最右边的价值
0 2023-05-25
编程技术问答社区
在后台运行进程而不被init、Perl采用
如果我通过Perl程序运行外部过程,Perl程序将仍然是该过程的父母.使过程管理变得容易. system('sleep 3000'); # perl is still the parent 但是,如果我尝试在后台运行该过程,以便程序不必等待该过程退出... system('sleep 3000 &'); sleep过程将由系统init过程采用,并且不再与执行该过程的程序相关联. 在这种情况下处理过程管理的正确方法是什么?如何在后台模拟运行该过程但保持祖先的过程? 解决方案 您可以使用 threads , use threads; my $t = async { system('sleep 3000'); }; # do something in parallel .. # wait for thread to finish $t->join; 或 fork sub fasync(&) { my ($worker) = @_;
8 2023-05-24
编程技术问答社区
用于n-Core处理器的Perl分叉队列
我正在编写类似于建议的应用系统 - 呼叫到finish/2232057">在这里.本质上,我正在使用PERL来管理多个CPU密集过程的执行,并通过叉和等待.但是,我在四核机上运行,​​并且还有更多的流程,所有这些过程都有非常不同的预期运行时间,但不知道先验. 最终,要估算运行时间并适当地将它们构成的努力要比简单地使用每个核心的队列系统.最终,我希望每个核心都在处理尽可能少的时间,直到一切完成为止.是否有首选的算法或机制可以做到这一点?我认为这是一个常见的问题/使用,所以我不想重新发明轮子,因为我的车轮可能不如"正确的方式". ' 作为未成年人,我宁愿不必导入其他模块(例如 Parallel :: forkmanager )要实现这一目标,但是如果这是最好的方法,那么我会考虑的. 〜谢谢! 编辑:修复了'此处'链接:感谢 ikegami 编辑: p :: fm太容易使用,不要...今天我学会了. 解决方案 Forks::Super 具有某些适合这种功能
0 2023-05-24
编程技术问答社区
Win32::OLE可以并行使用以启动多个Matlab实例吗?
当 Parallel::Loops 与 Win32::OLE 创建MATLAB的多个实例,如果我们使用 my $ML = Win32::OLE->new('Matlab.Application') or die "Cannot start MATLAB" 在每个循环中,程序崩溃,显示一个未手持异常. 如果在$ML之前删除my,则可以在任何时候运行一个实例. 解决方案 我不确定在并行循环中创建多个MATLAB COM服务器有什么好处. 默认情况下,服务器是在共享模式下创建的,即所有实例共享. MATLAB引擎作为单线程接触到用户,因此在您的情况下,所有客户端的计算均以串行运行,而不是并行. 幸运的是,您在专用模式下创建Matlab com服务器: Win32::OLE->new('Matlab.Application.single') 请参阅 ps:我几乎不知道perl:) 其他解决方案 您确实应该显示您的完整代码. 如果您正在设
0 2023-05-24
编程技术问答社区
在Perl中对Selenium Grid进行平行测试执行
我有一个perl脚本,该脚本在多个浏览器中执行.我需要在sub setup()中设置此脚本,以继续执行.当setup()遇到sub } 的末尾时,我遇到问题 代码如下: my @browser = ('*firefox','*iexplore'); my $i = @browser; $pm = new Parallel::ForkManager($i); foreach $browser (@browser){ $pid = $pm->start and next; $sel = WWW::Selenium->new( host => $host , port => 4444, browser => $browser, browser_url => $url,); $sel->start(); print("\n Execution : ".$browser."\n"); $sel->open("/")
4 2023-05-24
编程技术问答社区
如何提高perl脚本的性能?
我正在运行UCM2.PL脚本来扫描巨大的目录结构(目录是映射到本地的网络驱动器).我有两个Perl脚本UCM1.PL和UCM2.PL.我正在为不同的参数运行ucm2.pl,并通过ucm1.pl. 来调用. ucm1.pl- #!/usr/bin/perl use strict; use warnings; use Parallel::ForkManager; my $filename ="intfSplitList.txt"; #(this will have list of all the input files. eg intfSplit_0....intfSplit_50) my $lines; my $buffer; open(FILE, $filename) or die "Can't open `$filename': $!"; while () {
0 2023-05-24
编程技术问答社区
Perl Parallel::Forkmanager不允许收集变量值
也许是因为子进程不知道我的哈希(请参阅下面的代码),所以哈希%输出没有收集任何内容. > foreach $Item (@AllItems) { $pid = $pm->start($Item) and next; $Temp = qx($Item); $output{$Item}= $Temp; // This doesn't collect anything. :-( $pm->finish; } $pm->wait_all_children; tia, 蒂姆 解决方案 分叉的过程有自己的记忆的自己的副本(嗯,副本).在子过程中写信给哈希不会影响父母的哈希. 要做您想做的事,您需要采用某种IPC.请参阅 perlipc manpage Manpage详细讨论各种可能性. > 对于这样的东西,我可能会使用简单的磁盘哈希. db_file 提供了一个不错的绑定哈希界.这是您可以做到的: use strict; use warnings; use DB
0 2023-05-24
编程技术问答社区
如何在使用Parallel::Forkmanager时解决Net::SSH::Expect "SSHAuthenticationError Login timed out "问题?
当我使用Parallel :: Forkmanager完成远程SSH的并行过程时,如果远程设备无法实现,则遇到了" Sshauthenticationerror登录时间"问题,然后完全弄乱了Stdout. 那么如何解决这个混乱的Stdout问题? 为什么我们可以使用eval {ssh操作}来解决? 谢谢. 解决方案 您可以尝试 net :: openssh ,它甚至会让您允许您在没有太多麻烦的所有主机中并行运行操作. 您也可以尝试增加timeout. 另一个可能的解决方案可能是下面的 之类的东西 my $retry_count = 0; while(1){ $rc = eval{$ssh->login();}; last if defined $rc; last if $retry_count >= $max_retry_count; $retry_count++; sleep 1; } 另请参阅:
0 2023-05-24
编程技术问答社区